Compare commits

...

127 Commits

Author SHA1 Message Date
1393de8057 v5.3.0 2019-05-27 17:21:45 +03:00
2092aef589 [ios][odf] fixed build 2019-05-27 13:58:50 +03:00
eff937699b . 2019-05-27 13:39:25 +03:00
3efc1f0432 [ios][x2t] fixed build 2019-05-27 13:01:12 +03:00
69fee1ae0b . 2019-05-23 20:03:25 +03:00
a0cc6b6274 OdfFormatWriter - ...; fix vml comment 2019-05-23 17:28:24 +03:00
31eb395858 OdfFormat - ... 2019-05-21 19:05:00 +03:00
ed1019a004 Not writing transparency group in pdfa mode 2019-05-20 17:09:22 +03:00
4e554d128a Merge pull request #143 from ONLYOFFICE/feature/tester
Feature/tester
2019-05-20 14:39:17 +03:00
b8d441a327 Fix remove exe 2019-05-20 14:34:24 +03:00
8fb809bf4a tester 2019-05-20 14:22:26 +03:00
35c4d70cf5 Fix bug 41615 2019-05-20 11:57:52 +03:00
58952393f0 OdfFormat - data validations 2019-05-19 17:12:43 +03:00
0b987aeed2 Add variable for xp support 2019-05-17 15:00:16 +03:00
c7315e2f21 OdfFormatReader -... 2019-05-16 19:43:29 +03:00
aefb229343 [x2t] Fix typo (Core props) 2019-05-16 18:25:10 +03:00
ac080b3485 Merge commit 'eb9d69d1ec6f23036a820992cd1957463851ef04' into develop 2019-05-16 15:41:55 +03:00
eb9d69d1ec Fix svg bug 2019-05-15 19:28:02 +03:00
eb4ffee9e7 OdfFormat - ... 2019-05-15 19:07:34 +03:00
763347d8ec OdfFormatWriter -.. 2019-05-15 16:35:29 +03:00
9670d021c2 x2t - fix bug #41503 2019-05-14 19:22:20 +03:00
232115e684 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-05-14 14:08:38 +03:00
79f18355fe x2t - fix bug #41515 2019-05-13 15:27:03 +03:00
f86055c713 Epub images bug (xml files) 2019-05-08 12:51:29 +03:00
ea82bea6f1 . 2019-04-29 15:21:20 +03:00
28f5b1251a XlsxFormat - fix bug #41458 2019-04-29 14:20:41 +03:00
39fbf06511 PptFormatReader - fix bug #40482 2019-04-29 14:20:41 +03:00
a265d82dda Merge remote-tracking branch 'origin/feature/fix_v5.3' into develop 2019-04-27 17:30:36 +03:00
e68b550d1e OdfFormatReader - fix bug #41408 2019-04-27 17:14:31 +03:00
0821edca07 OdfFormatReader - fix bug #41408 2019-04-27 16:26:46 +03:00
bc4faa26b9 Fix linux build 2019-04-26 17:06:30 +03:00
668a89bbd1 Merge pull request #132 from ONLYOFFICE/feature/svg
Feature/svg
2019-04-26 16:50:48 +03:00
832d35dc17 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-26 16:39:58 +03:00
2d21d334cf OdfFormatReader - fix bug #41408 2019-04-26 16:36:56 +03:00
b23bc97fdb Fix bugs 2019-04-25 18:26:02 +03:00
f4df80ebf3 OdfFormatReader - fix bug #41409 2019-04-25 17:30:06 +03:00
230c51689d DocFormatReader - fix bug #41378 2019-04-24 15:48:41 +03:00
799fcbc342 [ios][x2t] fixed build 2019-04-24 15:39:43 +03:00
1d25f72ac9 SVG full support 2019-04-24 14:14:34 +03:00
9bfb0321b2 svg position support 2019-04-24 11:45:07 +03:00
6c1bdc6ff8 . 2019-04-23 19:27:56 +03:00
826be463f5 PdfWriter: Making full-transparent image pixels white 2019-04-23 18:10:07 +03:00
469ce9aafb [ios][x2t] fixed build 2019-04-23 18:07:50 +03:00
29bb606d04 . 2019-04-23 14:17:10 +03:00
8f8995cbe7 . 2019-04-23 11:00:39 +03:00
fb1ae2c79a . 2019-04-23 10:45:51 +03:00
0f4d594248 . 2019-04-22 18:56:37 +03:00
152d05d5a5 . 2019-04-22 18:40:22 +03:00
942767eb79 . 2019-04-22 17:08:37 +03:00
5c070f0475 . 2019-04-22 16:50:53 +03:00
17c68ae414 OdfFormatWriter - ... 2019-04-22 13:16:23 +03:00
ab45804644 . 2019-04-19 18:50:12 +03:00
5f7288f66f . 2019-04-19 17:41:29 +03:00
b308f53e76 . 2019-04-19 14:45:55 +03:00
0982b8fb11 OdfFormatWriter - .. 2019-04-18 20:01:12 +03:00
4cca54900d . 2019-04-18 18:46:34 +03:00
b66ed403e1 . 2019-04-18 18:22:08 +03:00
692fe69426 OdfFormatWriter - controls 2019-04-18 12:24:36 +03:00
428b5971e8 . 2019-04-17 18:55:31 +03:00
32193b8a04 x2t - for bug 41281 2019-04-17 18:01:14 +03:00
5bb1de7dbd Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-17 13:29:49 +03:00
97531fe80f OdfFormatReader - fix bug #41258 2019-04-17 12:06:54 +03:00
84755143fa . 2019-04-16 17:55:33 +03:00
37ab11c58a OdfFormatWriter - fix user file 2019-04-16 17:28:50 +03:00
22cdeaf821 Fix build error 2019-04-16 16:59:58 +03:00
ee4d2079dc Update videoplayerlib path 2019-04-16 12:46:09 +03:00
68606f4cb0 Change docbuilder path 2019-04-15 19:13:36 +03:00
dbb11a480e Move docbuilder to core 2019-04-15 18:31:47 +03:00
6c29f811d9 x2t - fixed bug #40823 2019-04-15 14:15:57 +03:00
eb157610d3 DocFormatReader - fix bug #41172 2019-04-15 12:06:30 +03:00
89ac698d35 . 2019-04-15 11:30:23 +03:00
e1d910f952 . 2019-04-13 12:04:23 +03:00
ef7331d803 [x2t] Add MoveFromRangeStart to Editor.bin in all levels(body, p ...) 2019-04-12 19:01:29 +03:00
5bb3ca6aff Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-04-12 18:38:53 +03:00
bae655ba49 GetTickCount on MacOS 2019-04-12 18:38:42 +03:00
e4b4949471 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-12 18:32:21 +03:00
2bfcfbf21c . 2019-04-12 18:31:41 +03:00
1266382747 . 2019-04-12 14:17:34 +03:00
287059a891 x2t - fix users files 2019-04-11 19:54:04 +03:00
966809a8f2 x2t - bin - read/write activeX(convert to control) 2019-04-11 17:15:29 +03:00
d8f8720d05 [x2t] Fix writing to Editor.bin. For bug 40914. 2019-04-11 16:31:55 +03:00
aa8471b024 [x2t] Fix reading from Editor.bin 2019-04-08 19:52:54 +03:00
27c9b40ad3 [ios][x2t] fixed build 2019-04-05 11:53:33 +03:00
699eb731b4 x2t - bin - form controls read/write 2019-04-04 20:02:26 +03:00
0eb032a281 . 2019-04-04 15:38:02 +03:00
f89174ded5 . 2019-04-04 14:02:02 +03:00
ff1d53637a x2t - bin - writing xlsx controls 2019-04-02 18:44:10 +03:00
e825b4359f Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-02 17:14:46 +03:00
d11b74007d . 2019-04-02 12:16:22 +03:00
45d5f3b130 . 2019-04-01 18:48:43 +03:00
25022ceecc XlsxFormat - ctrlProps 2019-04-01 18:25:53 +03:00
1a7476e465 x2t - XlsxFormat - fix bug #40316 - queryTables, connections, dataValidations 2019-03-31 17:19:47 +03:00
0edc2729e8 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-28 12:23:48 +03:00
d898f0ef2f OdfFormatW - ... 2019-03-27 18:35:33 +03:00
d51f004b11 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-27 13:49:34 +03:00
c645ed6aeb OdfFormatW - ... 2019-03-27 13:46:53 +03:00
79aa50d712 [x2t] Add OutlineLevelCol, OutlineLevelRow to Editor.bin 2019-03-25 19:56:24 +03:00
3dcb378de7 . 2019-03-25 19:24:44 +03:00
87c4ebe1d4 x2t - ... 2019-03-25 16:18:54 +03:00
fdef699b9b [ios][x2t] fixed build 2019-03-25 15:14:24 +03:00
498d58e856 x2t - ... 2019-03-25 13:50:29 +03:00
441aa277e3 XlsFormat - fixbug #40932 2019-03-25 13:15:18 +03:00
e8c314e535 . 2019-03-21 13:54:38 +03:00
12c8cf112a . 2019-03-21 13:51:57 +03:00
c9fb5cbe4d x2t - ... 2019-03-21 13:09:52 +03:00
8573513168 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-20 18:53:57 +03:00
4e337b5ef1 XlsFormat - fix user file 2019-03-20 18:49:38 +03:00
7e0e30d00f [x2t] Fix xlsx->Editor.bin conversion with invalid cell refs
<x:c r="2:1" instead of "B1"
2019-03-20 14:00:05 +03:00
72c4727a1e XlsFormat - fix bug #40895 2019-03-20 12:54:00 +03:00
29c197f383 XlsFormat - fix bug #40879 2019-03-19 19:49:40 +03:00
c07bd58bda XlsFormat -... 2019-03-18 19:58:20 +03:00
ae9a7f7fad [zlib] Fix 7-zip Warning: Headers error
Problem in header field: "last mod file date".
tm_sec = tm_min = tm_hour = tm_mday = tm_mon = tm_year = 0; is considered as 0 Jan 1980 (0x00200000 in file)
default value of tm_mon should be -1 (zip64local_TmzDateToDosDate tm_mon+1)
2019-03-15 19:26:57 +03:00
1157d6f97f . 2019-03-15 17:27:25 +03:00
5483547ee7 . 2019-03-15 15:47:26 +03:00
b9608771a9 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-15 14:51:35 +03:00
b3d219ef58 . 2019-03-15 14:50:29 +03:00
46a6e35a35 . 2019-03-15 14:48:53 +03:00
cfea717d20 XlsxFormat - dataValidation (+x14) 2019-03-14 19:53:11 +03:00
ae45b240a3 XlsFormat - ... 2019-03-14 19:44:37 +03:00
0ec79f2c2d . 2019-03-14 13:46:42 +03:00
6f0d22c3a4 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-14 12:06:08 +03:00
8d074cadf8 OdfFormatReader - ... 2019-03-14 12:04:44 +03:00
4a3b56d0d5 OdfFormatReader - .. 2019-03-14 12:03:22 +03:00
195e9079db Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-13 19:09:19 +03:00
8e8fd1096f . 2019-03-13 19:07:50 +03:00
b60811fd0d DocxFormat - read/write ooxml chart_ex 2019-03-13 16:30:09 +03:00
9eb82fa85e DocFormatReader - fix bug #40841 2019-03-13 14:06:10 +03:00
345 changed files with 30131 additions and 6982 deletions

4
.gitignore vendored
View File

@ -63,4 +63,6 @@ X2tConverter/Common/DocxFormat/DocxFormatLib/Makefile
*.zip
*.tar.gz
**/*.build/
*.dat
*.txt
*.log

View File

@ -769,12 +769,18 @@ namespace DocFileFormat
return bytes;
}
static inline std::wstring IntToWideString(int value)
static inline std::wstring IntToWideString(unsigned int value)
{
return (std::to_wstring(value));
}
static inline std::wstring IntToWideString(int value)
{
return (std::to_wstring(value));
}
static inline std::wstring SizeTToWideString(size_t value)
{
return (std::to_wstring((unsigned int)value));
}
static inline std::wstring DoubleToWideString(double value)
{
std::wstringstream src;

View File

@ -87,15 +87,14 @@ namespace DocFileFormat
}
else
{
m_nDTTM = reader->ReadUInt32();
m_nDTTM = DateAndTime(reader->ReadUInt32());
reader->ReadUInt16(); //padding1
m_nDepth = reader->ReadUInt32();
m_nDiatrdParent = reader->ReadUInt32();
unsigned int flag = reader->ReadUInt32();
m_fInkAtn = GETBIT(flag, 1);
}
return static_cast<ByteStructure*>(newObject);
}
}

View File

@ -32,6 +32,7 @@
#pragma once
#include "ByteStructure.h"
#include "DateAndTime.h"
namespace DocFileFormat
{
@ -72,7 +73,7 @@ namespace DocFileFormat
return (nWordVersion > 0) ? STRUCTURE_SIZE_OLD : STRUCTURE_SIZE;
}
AnnotationReferenceExDescriptor() : m_nDTTM(0), m_nDepth(0), m_nDiatrdParent(0), m_fInkAtn(false)
AnnotationReferenceExDescriptor() : m_nDepth(0), m_nDiatrdParent(0), m_fInkAtn(false)
{
}
@ -82,7 +83,7 @@ namespace DocFileFormat
virtual ByteStructure* ConstructObject( VirtualStreamReader* reader, int length );
unsigned int m_nDTTM;
DateAndTime m_nDTTM;
unsigned int m_nDepth;
unsigned int m_nDiatrdParent;
bool m_fInkAtn;

View File

@ -85,9 +85,11 @@ namespace DocFileFormat
if (author_str)
{
XMLTools::XMLAttribute author( L"w:author", FormatUtils::XmlEncode(*author_str));
XMLTools::XMLAttribute author( L"w:author", FormatUtils::XmlEncode(*author_str));
rPrChange.AppendAttribute( author );
}
XMLTools::XMLAttribute date( L"w:date", _revisionData->Dttm.getString());
rPrChange.AppendAttribute( date );
//convert revision stack
convertSprms( _revisionData->Changes, &rPrChange );

View File

@ -85,34 +85,31 @@ namespace DocFileFormat
for (size_t index = 0; index < count; ++index)
{
AnnotationReferenceDescriptor* atrdPre10 = static_cast<AnnotationReferenceDescriptor*>(m_document->AnnotationsReferencePlex->Elements[index]);
AnnotationReferenceExDescriptor* atrdPost10 = m_document->AnnotationsReferenceExPlex ? static_cast<AnnotationReferenceExDescriptor*>(m_document->AnnotationsReferenceExPlex->Elements[index]) : NULL;
AnnotationReferenceExDescriptor* atrdPost10 = NULL;
if ((m_document->AnnotationsReferenceExPlex) && (index < m_document->AnnotationsReferenceExPlex->Elements.size()))
{
atrdPost10 = static_cast<AnnotationReferenceExDescriptor*>(m_document->AnnotationsReferenceExPlex->Elements[index]);
}
m_pXmlWriter->WriteNodeBegin( L"w:comment", TRUE );
if (atrdPre10->m_BookmarkId < 0)
if (atrdPre10->m_BookmarkId < 0)//-1 - easy ref (not start/end comment ref)
{
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString( index + 1 + count + 1024 ));
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::SizeTToWideString( index + 1 + count + 1024 ));
}
else
{
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString( index + 1 ));
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::SizeTToWideString( index + 1 ));
}
if (atrdPost10)
{
//!!!TODO!!!
/*//ATRDpost10 is optional and not saved in all files
if (doc.AnnotationReferenceExtraTable != null &&
doc.AnnotationReferenceExtraTable.Count > index)
{
AnnotationReferenceDescriptorExtra atrdPost10 = doc.AnnotationReferenceExtraTable[index];
atrdPost10.Date.Convert(new DateMapping(_writer));
}*/
m_pXmlWriter->WriteAttribute( L"w:date", atrdPost10->m_nDTTM.getString());
}
if (atrdPre10->m_AuthorIndex < m_document->AnnotationOwners->size()) //conv_253l2H1CehgKwsxCtNk__docx.doc
{
m_pXmlWriter->WriteAttribute( L"w:author",
FormatUtils::XmlEncode(m_document->AnnotationOwners->at( atrdPre10->m_AuthorIndex ) ));
}
m_pXmlWriter->WriteAttribute( L"w:initials", atrdPre10->m_UserInitials);
m_pXmlWriter->WriteAttribute( L"w:initials", FormatUtils::XmlEncode(atrdPre10->m_UserInitials));

View File

@ -83,6 +83,14 @@ namespace DocFileFormat
//throw new ByteParseException("Cannot parse the struct DTTM, the length of the struct doesn't match");
}
}
std::wstring getString()
{
return std::to_wstring(yr) + L"-" + (mon < 9 ? L"0" : L"" ) + std::to_wstring(mon) + L"-" +
(dom < 9 ? L"0" : L"" ) + std::to_wstring(dom) + L"T" +
(hr < 9 ? L"0" : L"" ) + std::to_wstring(hr) + L":" +
(mint < 9 ? L"0" : L"" )+ std::to_wstring(mint) + L"Z";
}
#if defined(_WIN32) || defined(_WIN64)
SYSTEMTIME ToSYSTEMTIME()
{

View File

@ -406,8 +406,8 @@ namespace DocFileFormat
//if it's a inserted run
m_pXmlWriter->WriteNodeBegin(L"w:ins", true);
m_pXmlWriter->WriteAttribute(L"w:author", FormatUtils::XmlEncode(*author));
m_pXmlWriter->WriteAttribute(L"w:date", FormatUtils::XmlEncode(rev.Dttm.getString()));
m_pXmlWriter->WriteNodeEnd(L"", true, false);
//rev.Dttm.Convert(new DateMapping(m_pXmlWriter));
}
//start run
@ -1079,7 +1079,15 @@ namespace DocFileFormat
else if ((m_document->AnnotationsReferencePlex) && (_commentNr <= m_document->AnnotationsReferencePlex->Elements.size()))
{
m_pXmlWriter->WriteNodeBegin( L"w:commentReference", true );
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString( _commentNr++ ));
int index = _commentNr++;
AnnotationReferenceDescriptor* atrdPre10 = static_cast<AnnotationReferenceDescriptor*>(m_document->AnnotationsReferencePlex->Elements[index - 1]);
if (atrdPre10->m_BookmarkId < 0)
index += m_document->AnnotationsReferencePlex->Elements.size() + 1024;
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString(index));
m_pXmlWriter->WriteNodeEnd( L"", true );
}
}
@ -1792,7 +1800,7 @@ namespace DocFileFormat
if (m_document->AnnotStartEndCPs[i].second == cp)
{
result = writeAnnotationEnd(i + 1);
_commentNr = i + 1;
//_commentNr = i + 1;
}
}

View File

@ -92,7 +92,7 @@ namespace DocFileFormat
{
//start abstractNum
m_pXmlWriter->WriteNodeBegin( L"w:abstractNum", TRUE );
m_pXmlWriter->WriteAttribute( L"w:abstractNumId", FormatUtils::IntToWideString( i /*+ 1 */));
m_pXmlWriter->WriteAttribute( L"w:abstractNumId", FormatUtils::SizeTToWideString( i /*+ 1 */));
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
//nsid
@ -140,7 +140,7 @@ namespace DocFileFormat
{
//start abstractNum
m_pXmlWriter->WriteNodeBegin( L"w:abstractNum", TRUE );
m_pXmlWriter->WriteAttribute( L"w:abstractNumId", FormatUtils::IntToWideString( rglst->listNumbering[i]->id ));
m_pXmlWriter->WriteAttribute( L"w:abstractNumId", FormatUtils::SizeTToWideString( rglst->listNumbering[i]->id ));
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
////nsid
@ -169,7 +169,7 @@ namespace DocFileFormat
//start num
m_pXmlWriter->WriteNodeBegin( L"w:num", TRUE );
m_pXmlWriter->WriteAttribute( L"w:numId", FormatUtils::IntToWideString(i + 1));
m_pXmlWriter->WriteAttribute( L"w:numId", FormatUtils::SizeTToWideString(i + 1));
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
int index = FindIndexbyId( rglst->listData, lfo->lsid );
@ -205,12 +205,12 @@ namespace DocFileFormat
for (size_t i = 0; i < rglst->listNumbering.size(); ++i)
{
m_pXmlWriter->WriteNodeBegin( L"w:num", TRUE );
m_pXmlWriter->WriteAttribute( L"w:numId", FormatUtils::IntToWideString(rglst->listNumbering[i]->id));
m_pXmlWriter->WriteAttribute( L"w:numId", FormatUtils::SizeTToWideString(rglst->listNumbering[i]->id));
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
m_pXmlWriter->WriteNodeBegin( L"w:abstractNumId", TRUE );
m_pXmlWriter->WriteAttribute( L"w:val", FormatUtils::IntToWideString( rglst->listNumbering[i]->id ));
m_pXmlWriter->WriteAttribute( L"w:val", FormatUtils::SizeTToWideString( rglst->listNumbering[i]->id ));
m_pXmlWriter->WriteNodeEnd( L"", TRUE );
m_pXmlWriter->WriteNodeEnd(L"w:num");
@ -285,7 +285,7 @@ namespace DocFileFormat
newResult = find_if((result + 1), lvl->xst.end(), &NumberingMapping::IsPlaceholder);
ret += L"%";
ret += FormatUtils::IntToWideString(*result + 1);
ret += FormatUtils::SizeTToWideString(*result + 1);
ret += std::wstring((result + 1), newResult);
result = newResult;
}

View File

@ -89,7 +89,7 @@ namespace DocFileFormat
GroupContainer* group = static_cast<GroupContainer*>(groupChild);
if (group)
{
group->Index = i;
group->Index = (int)i;
}
}
else if (ShapeContainer::TYPE_CODE_0xF004 == groupChild->TypeCode)

View File

@ -85,19 +85,19 @@ namespace DocFileFormat
struct ImageFileStructure
{
ImageFileStructure()
ImageFileStructure(const std::wstring& _ext, boost::shared_array<unsigned char> _data, unsigned int _size, Global::BlipType _blipType = Global::msoblipUNKNOWN) : ext(_ext), data(_data), size(_size), blipType(_blipType)
{
}
ImageFileStructure(const std::wstring& _ext, const std::vector<unsigned char>& _data, Global::BlipType _blipType = Global::msoblipUNKNOWN) : ext(_ext), data(_data), blipType(_blipType)
ImageFileStructure(const std::wstring& _ext, unsigned char* _data, unsigned int _size, Global::BlipType _blipType = Global::msoblipUNKNOWN) : ext(_ext), size(_size), blipType(_blipType)
{
data = boost::shared_array<unsigned char>(new unsigned char[size]);
memcpy(data.get(), _data, size);
}
std::wstring ext;
std::vector<unsigned char> data;
Global::BlipType blipType;
std::wstring ext;
boost::shared_array<unsigned char> data;
unsigned int size;
Global::BlipType blipType;
};
struct OleObjectFileStructure

View File

@ -33,6 +33,8 @@
#include "PictureDescriptor.h"
#include "OfficeDrawing/MetafilePictBlip.h"
#include "../../DesktopEditor/raster/BgraFrame.h"
#ifndef MM_ISOTROPIC
#define MM_ISOTROPIC 7
#endif
@ -41,6 +43,111 @@
#define MM_ANISOTROPIC 8
#endif
namespace ImageHelper
{
Global::_BlipType SaveImageToFileFromDIB(unsigned char* data, int size, const std::wstring& file_name)//without ext
{
Global::_BlipType result = Global::msoblipERROR;
CBgraFrame oFrame;
int offset = 0, biSizeImage = 0;
__BITMAPINFOHEADER * header = (__BITMAPINFOHEADER*)data;
if (!header) return result;
result = Global::msoblipDIB;
if (header->biWidth > 100000 || header->biHeight > 100000 || header->biSize != 40)
{
__BITMAPCOREHEADER * header_core = (__BITMAPCOREHEADER *)data;
if (header_core->bcSize != 12)
{
result = Global::msoblipWMF;
}
else
{
offset = 12; //sizeof(BITMAPCOREHEADER)
oFrame.put_Height (header_core->bcHeight );
oFrame.put_Width (header_core->bcWidth );
int sz_bitmap = header_core->bcHeight * header_core->bcWidth * header_core->bcBitCount/ 8;
//if (header_core->bcWidth % 2 != 0 && sz_bitmap < size - offset)
// header_core->bcWidth++;
///???? todooo непонятно .. в biff5 нужно флипать картинку, в biff8 не ясно ( -
int stride = -(size - offset) / header_core->bcHeight;
oFrame.put_Stride (stride/*header_core->bcBitCount * header_core->bcWidth /8 */);
biSizeImage = size - offset;
if (-stride >= header_core->bcWidth && header_core->bcBitCount >=24 )
{
result = Global::msoblipPNG;
}
}
}
else
{
offset = 40; //sizeof(BITMAPINFOHEADER)
oFrame.put_Height (header->biHeight );
oFrame.put_Width (header->biWidth );
int sz_bitmap = header->biHeight * header->biWidth * header->biBitCount/ 8;
//if (header->biWidth % 2 != 0 && sz_bitmap < size -offset)
// header->biWidth++;
int stride = -(size - offset) / header->biHeight;
if (-stride >= header->biWidth && header->biBitCount >= 24)
{
result = Global::msoblipPNG;
}
oFrame.put_Stride (stride/*header->biBitCount * header->biWidth /8*/);
biSizeImage = header->biSizeImage > 0 ? header->biSizeImage : (size - offset);
}
//------------------------------------------------------------------------------------------
if (result == Global::msoblipPNG)
{
oFrame.put_Data((unsigned char*)data + offset);
if (!oFrame.SaveFile(file_name + L".png", 4/*CXIMAGE_FORMAT_PNG*/))
result = Global::msoblipERROR;
oFrame.put_Data(NULL);
}
else if (result == Global::msoblipWMF)
{
NSFile::CFileBinary file;
if (file.CreateFileW(file_name + L".wmf"))
{
file.WriteFile((BYTE*)data, size);
file.CloseFile();
}
}
else if (biSizeImage > 0)
{
NSFile::CFileBinary file;
if (file.CreateFileW(file_name + L".bmp"))
{
_UINT16 vtType = 0x4D42; file.WriteFile((BYTE*)&vtType, 2);
_UINT32 dwLen = biSizeImage; file.WriteFile((BYTE*)&dwLen, 4);
_UINT32 dwRes = 0; file.WriteFile((BYTE*)&dwRes, 4);
_UINT32 dwOffset = 2; file.WriteFile((BYTE*)&dwOffset, 4);
file.WriteFile((BYTE*)data, size);
file.CloseFile();
}
}
return result;
}
}
namespace DocFileFormat
{
/// Parses the CHPX for a fcPic an loads the PictureDescriptor at this offset

View File

@ -134,3 +134,34 @@ namespace DocFileFormat
int embeddedDataSize;
};
}
namespace ImageHelper
{
struct __BITMAPINFOHEADER
{
_UINT32 biSize;
_INT32 biWidth;
_INT32 biHeight;
_UINT16 biPlanes;
_UINT16 biBitCount;
_UINT32 biCompression;
_UINT32 biSizeImage;
_INT32 biXPelsPerMeter;
_INT32 biYPelsPerMeter;
_UINT32 biClrUsed;
_UINT32 biClrImportant;
};
struct __BITMAPCOREHEADER
{
_UINT32 bcSize; /* used to get to color table */
_UINT16 bcWidth;
_UINT16 bcHeight;
_UINT16 bcPlanes;
_UINT16 bcBitCount;
};
Global::_BlipType SaveImageToFileFromDIB(unsigned char* data, int size, const std::wstring& file_name);
}

View File

@ -67,7 +67,7 @@ namespace DocFileFormat
XMLTools::XMLAttribute layoutType ( L"w:type", L"fixed");
bool bLayoutFixed = true;
short tblIndent = 0;
_CP_OPT(short) tblIndent;
short gabHalf = 0;
short marginLeft = 0;
short marginRight = 0;
@ -98,8 +98,7 @@ namespace DocFileFormat
//For this cases we can calculate the indent of the table by getting the
//first boundary of the TDef and adding the padding of the cells
tblIndent = FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize );
tblIndent += gabHalf;
tblIndent = gabHalf + FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize );
//If there follows a real sprmTWidthIndent, this value will be overwritten
//tblIndent = (std::max)((int)tblIndent,0); //cerere.doc
@ -404,11 +403,11 @@ namespace DocFileFormat
}
//indent
if ( tblIndent != 0 )
if ( tblIndent )
{
XMLTools::XMLElement tblInd( L"w:tblInd");
XMLTools::XMLAttribute tblIndW( L"w:w", FormatUtils::IntToWideString( tblIndent ) );
XMLTools::XMLAttribute tblIndW( L"w:w", FormatUtils::IntToWideString( *tblIndent ) );
tblInd.AppendAttribute( tblIndW );
XMLTools::XMLAttribute tblIndType( L"w:type", L"dxa");

View File

@ -557,10 +557,10 @@ namespace DocFileFormat
pict->embeddedDataSize += lLenHeader;
delete []pict->embeddedData;
pict->embeddedData = newData;
}
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(Global::msoblipDIB),
std::vector<unsigned char>(pict->embeddedData, (pict->embeddedData + pict->embeddedDataSize)), Global::msoblipDIB));
pict->embeddedData, pict->embeddedDataSize, Global::msoblipDIB));
m_nImageId = m_context->_docx->RegisterImage(m_caller, btWin32);
result = true;
@ -577,26 +577,44 @@ namespace DocFileFormat
if (metaBlip)
{//decompress inside MetafilePictBlip
unsigned char *newData = NULL;
int newDataSize = metaBlip->oMetaFile.ToBuffer(newData);
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32), std::vector<unsigned char>(newData, (newData + newDataSize))));
RELEASEARRAYOBJECTS(newData);
}
}
break;
unsigned int newDataSize = metaBlip->oMetaFile.ToBuffer(newData);
boost::shared_array<unsigned char> arData(newData);
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32), arData, newDataSize));
}
}break;
case Global::msoblipDIB:
{//user_manual_v52.doc
BitmapBlip* bitBlip = static_cast<BitmapBlip*>(oBlipEntry->Blip);
if (bitBlip)
{
std::wstring file_name = m_context->_doc->m_sTempFolder + L"tmp_image";
oBlipEntry->btWin32 = ImageHelper::SaveImageToFileFromDIB(bitBlip->m_pvBits, bitBlip->pvBitsSize, file_name);
if (oBlipEntry->btWin32 == Global::msoblipPNG)
{
unsigned char* pData = NULL;
DWORD nData = 0;
if (NSFile::CFileBinary::ReadAllBytes(file_name, &pData, nData))
{
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(Global::msoblipPNG),
boost::shared_array<unsigned char>(pData), nData, Global::msoblipPNG));
break;
}
}
}
}//в случае ошибки конвертации -храним оригинальный dib
case Global::msoblipJPEG:
case Global::msoblipCMYKJPEG:
case Global::msoblipPNG:
case Global::msoblipTIFF:
case Global::msoblipDIB:
{
BitmapBlip* bitBlip = static_cast<BitmapBlip*>(oBlipEntry->Blip);
if (bitBlip)
{
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32),
std::vector<unsigned char>(bitBlip->m_pvBits, (bitBlip->m_pvBits + bitBlip->pvBitsSize)), oBlipEntry->btWin32));
bitBlip->m_pvBits, bitBlip->pvBitsSize, oBlipEntry->btWin32));
}
}break;

View File

@ -1293,7 +1293,7 @@ namespace DocFileFormat
/// Copies the picture from the binary stream to the zip archive
/// and creates the relationships for the image.
bool VMLShapeMapping::copyPicture(const BlipStoreEntry* oBlip)
bool VMLShapeMapping::copyPicture(BlipStoreEntry* oBlip)
{
bool result = false;
@ -1304,9 +1304,9 @@ namespace DocFileFormat
switch (oBlip->btWin32)
{
case Global::msoblipEMF:
case Global::msoblipWMF:
case Global::msoblipPICT:
case Global::msoblipEMF:
case Global::msoblipWMF:
case Global::msoblipPICT:
{
//it's a meta image
MetafilePictBlip* metaBlip = static_cast<MetafilePictBlip*>(RecordFactory::ReadRecord(&reader, 0));
@ -1314,38 +1314,53 @@ namespace DocFileFormat
{
//meta images can be compressed
unsigned char* decompressed = NULL;
int decompressedSize = 0;
unsigned int decompressedSize = 0;
decompressedSize = metaBlip->Decompress(&decompressed);
if (0 != decompressedSize && NULL != decompressed)
{
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlip->btWin32), std::vector<unsigned char>(decompressed, (decompressed + decompressedSize))));
RELEASEARRAYOBJECTS(decompressed);
boost::shared_array<unsigned char> arDecompressed(decompressed);
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlip->btWin32), arDecompressed, decompressedSize));
}
RELEASEOBJECT(metaBlip);
}
}
break;
case Global::msoblipJPEG:
case Global::msoblipCMYKJPEG:
case Global::msoblipPNG:
case Global::msoblipTIFF:
case Global::msoblipDIB:
{
//it's a bitmap image
case Global::msoblipJPEG:
case Global::msoblipCMYKJPEG:
case Global::msoblipPNG:
case Global::msoblipTIFF:
case Global::msoblipDIB:
{//it's a bitmap image
BitmapBlip* bitBlip = static_cast<BitmapBlip*>(RecordFactory::ReadRecord(&reader, 0));
if ((bitBlip) && (bitBlip->m_pvBits))
{
if (oBlip->btWin32 == Global::msoblipDIB)
{
std::wstring file_name = m_context->_doc->m_sTempFolder + L"tmp_image";
if (Global::msoblipPNG == ImageHelper::SaveImageToFileFromDIB(bitBlip->m_pvBits, bitBlip->pvBitsSize, file_name))
{
oBlip->btWin32 = Global::msoblipPNG;
unsigned char* pData = NULL;
DWORD nData = 0;
if (NSFile::CFileBinary::ReadAllBytes(file_name, &pData, nData))
{
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(Global::msoblipPNG),
boost::shared_array<unsigned char>(pData), nData, Global::msoblipPNG));
break;
}
}//в случае ошибки конвертации -храним оригинальный dib
}
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlip->btWin32),
std::vector<unsigned char>(bitBlip->m_pvBits, (bitBlip->m_pvBits + bitBlip->pvBitsSize)), oBlip->btWin32));
bitBlip->m_pvBits, bitBlip->pvBitsSize, oBlip->btWin32));
RELEASEOBJECT (bitBlip);
}
}
break;
default:
}break;
default:
{
result = false;
return result;
@ -1431,8 +1446,7 @@ namespace DocFileFormat
{
//append size and position ...
//if (pSpa->fAnchorLock )
if (pSpa->bx == TEXT && pSpa->by == TEXT)
if (m_isInlineShape)
{
// appendStyleProperty( style, L"position", L"static" );
}
@ -1689,21 +1703,17 @@ namespace DocFileFormat
m_pSpa->bx = PAGE;
}
else
{
nRelH = m_pSpa->bx;
appendStyleProperty(oStyle, L"mso-position-horizontal-relative", mapHorizontalPositionRelative(m_pSpa->bx));
{//rel column
}
}
if (nRelV < 0 && m_pSpa)
{
if (m_pSpa->by == TEXT && bZIndex)
if (m_pSpa->by == TEXT && bZIndex)
{
m_pSpa->by = PAGE;
}
else
{
nRelV = m_pSpa->by;
appendStyleProperty(oStyle, L"mso-position-vertical-relative", mapVerticalPositionRelative(m_pSpa->by));
{//rel paragraph
}
}
if (!m_isInlineShape && !bZIndex)
@ -1814,7 +1824,7 @@ namespace DocFileFormat
//append size and position ...
//if (m_pSpa->fAnchorLock)//это возможность смены привязки , а не ее тип
if (m_pSpa->bx == TEXT && m_pSpa->by == TEXT)
if (m_isInlineShape)/*m_pSpa->bx == TEXT && m_pSpa->by == TEXT*/
{
// appendStyleProperty( style, L"position", L"static" );
}

View File

@ -80,7 +80,7 @@ namespace DocFileFormat
void WriteShape (const ShapeContainer* pContainer);
std::wstring GenShapeId(const Shape* pShape) const;
bool copyPicture( const BlipStoreEntry* bse );
bool copyPicture( BlipStoreEntry* bse );
std::wstring GetTargetExt( Global::BlipType _type ) const;
void AppendDimensionToStyle ( std::wstring& style, const PictureDescriptor* pict, bool twistDimensions ) const;

View File

@ -84,7 +84,7 @@ namespace DocFileFormat
Text(NULL), RevisionAuthorTable(NULL), FontTable(NULL), BookmarkNames(NULL), AutoTextNames(NULL),
IndividualFootnotesPlex(NULL), FootnoteReferenceCharactersPlex(NULL), IndividualEndnotesPlex(NULL),
EndnoteReferenceCharactersPlex(NULL), FieldsPlex(NULL), FootnoteDocumentFieldsPlex(NULL),
EndnoteDocumentFieldsPlex(NULL), HeadersAndFootersDocumentFieldsPlex(NULL), HeaderStoriesPlex(NULL),
EndnoteDocumentFieldsPlex(NULL), HeadersAndFootersDocumentFieldsPlex(NULL), HeaderStoriesPlex(NULL), AnnotationsFieldsPlex(NULL),
AnnotationsReferencePlex(NULL), AnnotationsReferenceExPlex(NULL), IndividualCommentsPlex(NULL), TextboxBreakPlex(NULL), TextboxBreakPlexHeader(NULL),
TextboxIndividualPlex(NULL),AssocNames(NULL), BookmarkAnnotNames(NULL), Captions(NULL), AutoCaptions(NULL), ListPlex(NULL),
OfficeDrawingPlex(NULL), OfficeDrawingPlexHeader(NULL), SectionPlex(NULL), BookmarkStartPlex(NULL), BookmarkEndPlex(NULL),
@ -353,7 +353,7 @@ namespace DocFileFormat
TextboxIndividualPlex = new Plex<FTXBXS> (FTXBXS::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcftxbxTxt, FIB->m_FibWord97.lcbPlcftxbxTxt, nWordVersion);
SectionPlex = new Plex<SectionDescriptor> (SectionDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcfSed, FIB->m_FibWord97.lcbPlcfSed, nWordVersion);
SectionPlex = new Plex<SectionDescriptor> (SectionDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcfSed,FIB->m_FibWord97.lcbPlcfSed, nWordVersion);
BookmarkStartPlex = new Plex<BookmarkFirst> (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkf, FIB->m_FibWord97.lcbPlcfBkf, nWordVersion);
BookmarkEndPlex = new Plex<EmptyStructure> (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkl, FIB->m_FibWord97.lcbPlcfBkl, nWordVersion);
@ -387,10 +387,13 @@ namespace DocFileFormat
}
AutoTextPlex = new Plex<EmptyStructure>(EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfGlsy, FIB->m_FibWord97.lcbPlcfGlsy, nWordVersion);
FieldsPlex = new Plex<FieldCharacter>(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldMom, FIB->m_FibWord97.lcbPlcfFldMom, nWordVersion);
FootnoteDocumentFieldsPlex = new Plex<FieldCharacter>(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldFtn, FIB->m_FibWord97.lcbPlcfFldFtn, nWordVersion);
EndnoteDocumentFieldsPlex = new Plex<FieldCharacter>(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldEdn, FIB->m_FibWord97.lcbPlcfFldEdn, nWordVersion);
HeadersAndFootersDocumentFieldsPlex = new Plex<FieldCharacter>(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldHdr, FIB->m_FibWord97.lcbPlcfFldHdr, nWordVersion);
AnnotationsFieldsPlex = new Plex<FieldCharacter>(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldAtn, FIB->m_FibWord97.lcbPlcfFldAtn, nWordVersion);
ListPlex = new Plex<ListNumCache> (ListNumCache::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBteLvc, FIB->m_FibWord97.lcbPlcfBteLvc, nWordVersion);
if (m_pCallFunc)
@ -872,6 +875,7 @@ namespace DocFileFormat
RELEASEOBJECT(FootnoteDocumentFieldsPlex);
RELEASEOBJECT(EndnoteDocumentFieldsPlex);
RELEASEOBJECT(HeadersAndFootersDocumentFieldsPlex);
RELEASEOBJECT(AnnotationsFieldsPlex);
RELEASEOBJECT(HeaderStoriesPlex);
RELEASEOBJECT(IndividualCommentsPlex);
RELEASEOBJECT(AnnotationsReferencePlex);

View File

@ -224,6 +224,7 @@ namespace DocFileFormat
Plex<FieldCharacter> *FootnoteDocumentFieldsPlex;
Plex<FieldCharacter> *EndnoteDocumentFieldsPlex;
Plex<FieldCharacter> *HeadersAndFootersDocumentFieldsPlex;
Plex<FieldCharacter> *AnnotationsFieldsPlex;
Plex<AnnotationReferenceDescriptor> *AnnotationsReferencePlex;
Plex<AnnotationReferenceExDescriptor> *AnnotationsReferenceExPlex;
Plex<EmptyStructure> *AutoTextPlex;

View File

@ -32,7 +32,6 @@
#include "WordprocessingDocument.h"
#include "../../DesktopEditor/raster/BgraFrame.h"
#include "../../DesktopEditor/common/Directory.h"
#include "../../DesktopEditor/common/SystemUtils.h"
@ -40,136 +39,6 @@
#include "../../Common/DocxFormat/Source/DocxFormat/Core.h"
#include "../../Common/DocxFormat/Source/DocxFormat/ContentTypes.h"
namespace ImageHelper
{
struct __BITMAPINFOHEADER
{
_UINT32 biSize;
_INT32 biWidth;
_INT32 biHeight;
_UINT16 biPlanes;
_UINT16 biBitCount;
_UINT32 biCompression;
_UINT32 biSizeImage;
_INT32 biXPelsPerMeter;
_INT32 biYPelsPerMeter;
_UINT32 biClrUsed;
_UINT32 biClrImportant;
};
struct __BITMAPCOREHEADER
{
_UINT32 bcSize; /* used to get to color table */
_UINT16 bcWidth;
_UINT16 bcHeight;
_UINT16 bcPlanes;
_UINT16 bcBitCount;
};
inline Global::_BlipType SaveImageToFileFromDIB(unsigned char* data, int size, const std::wstring& file_name)//without ext
{
Global::_BlipType result = Global::msoblipERROR;
CBgraFrame oFrame;
int offset = 0, biSizeImage = 0;
__BITMAPINFOHEADER * header = (__BITMAPINFOHEADER*)data;
if (!header) return result;
result = Global::msoblipDIB;
if (header->biWidth > 100000 || header->biHeight > 100000 || header->biSize != 40)
{
__BITMAPCOREHEADER * header_core = (__BITMAPCOREHEADER *)data;
if (header_core->bcSize != 12)
{
result = Global::msoblipWMF;
}
else
{
offset = 12; //sizeof(BITMAPCOREHEADER)
oFrame.put_Height (header_core->bcHeight );
oFrame.put_Width (header_core->bcWidth );
int sz_bitmap = header_core->bcHeight * header_core->bcWidth * header_core->bcBitCount/ 8;
//if (header_core->bcWidth % 2 != 0 && sz_bitmap < size - offset)
// header_core->bcWidth++;
///???? todooo непонятно .. в biff5 нужно флипать картинку, в biff8 не ясно ( -
int stride = -(size - offset) / header_core->bcHeight;
oFrame.put_Stride (stride/*header_core->bcBitCount * header_core->bcWidth /8 */);
biSizeImage = size - offset;
if (-stride >= header_core->bcWidth && header_core->bcBitCount >=24 )
{
result = Global::msoblipPNG;
}
}
}
else
{
offset = 40; //sizeof(BITMAPINFOHEADER)
oFrame.put_Height (header->biHeight );
oFrame.put_Width (header->biWidth );
int sz_bitmap = header->biHeight * header->biWidth * header->biBitCount/ 8;
//if (header->biWidth % 2 != 0 && sz_bitmap < size -offset)
// header->biWidth++;
int stride = -(size - offset) / header->biHeight;
if (-stride >= header->biWidth && header->biBitCount >= 24)
{
result = Global::msoblipPNG;
}
oFrame.put_Stride (stride/*header->biBitCount * header->biWidth /8*/);
biSizeImage = header->biSizeImage > 0 ? header->biSizeImage : (size - offset);
}
//------------------------------------------------------------------------------------------
if (result == Global::msoblipPNG)
{
oFrame.put_Data((unsigned char*)data + offset);
if (!oFrame.SaveFile(file_name + L".png", 4/*CXIMAGE_FORMAT_PNG*/))
result = Global::msoblipERROR;
oFrame.put_Data(NULL);
}
else if (result == Global::msoblipWMF)
{
NSFile::CFileBinary file;
if (file.CreateFileW(file_name + L".wmf"))
{
file.WriteFile((BYTE*)data, size);
file.CloseFile();
}
}
else if (biSizeImage > 0)
{
NSFile::CFileBinary file;
if (file.CreateFileW(file_name + L".bmp"))
{
_UINT16 vtType = 0x4D42; file.WriteFile((BYTE*)&vtType, 2);
_UINT32 dwLen = biSizeImage; file.WriteFile((BYTE*)&dwLen, 4);
_UINT32 dwRes = 0; file.WriteFile((BYTE*)&dwRes, 4);
_UINT32 dwOffset = 2; file.WriteFile((BYTE*)&dwOffset, 4);
file.WriteFile((BYTE*)data, size);
file.CloseFile();
}
}
return result;
}
}
namespace DocFileFormat
{
WordprocessingDocument::WordprocessingDocument(const std::wstring & _pathOutput, const WordDocument* _docFile) :
@ -275,24 +144,7 @@ namespace DocFileFormat
for (std::list<ImageFileStructure>::iterator iter = ImagesList.begin(); iter != ImagesList.end(); ++iter)
{
unsigned char* bytes = NULL;
bytes = new unsigned char[iter->data.size()];
if (bytes)
{
copy(iter->data.begin(), iter->data.end(), bytes);
if (Global::msoblipDIB == iter->blipType)
{//user_manual_v52.doc
std::wstring file_name = pathMedia + FILE_SEPARATOR_STR + L"image" + FormatUtils::IntToWideString(i++);
iter->blipType = ImageHelper::SaveImageToFileFromDIB(bytes, iter->data.size(), file_name);
}
else
{
SaveToFile(pathMedia, std::wstring(L"image" ) + FormatUtils::IntToWideString(i++) + iter->ext, (void*)bytes, (unsigned int)iter->data.size());
}
RELEASEARRAYOBJECTS(bytes);
}
SaveToFile(pathMedia, std::wstring(L"image" ) + FormatUtils::IntToWideString(i++) + iter->ext, (void*)iter->data.get(), iter->size);
}
}

View File

@ -2,20 +2,17 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DocFormatLib", "..\DocFormatLib\Win32\DocFormatLib.vcproj", "{C5371405-338F-4B70-83BD-2A5CDF64F383}"
ProjectSection(ProjectDependencies) = postProject
{C27E9A9F-3A17-4482-9C5F-BF15C01E747C} = {C27E9A9F-3A17-4482-9C5F-BF15C01E747C}
{77DDC8D7-5B12-4FF2-9629-26AEBCA8436D} = {77DDC8D7-5B12-4FF2-9629-26AEBCA8436D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XlsFormat", "..\..\ASCOfficeXlsFile2\source\win32\XlsFormat.vcproj", "{77DDC8D7-5B12-4FF2-9629-26AEBCA8436D}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DocFormatTest", "DocFormatTest.vcproj", "{0F49D5D1-A8D3-4F97-8BC1-E2F65BB00C10}"
ProjectSection(ProjectDependencies) = postProject
{C5371405-338F-4B70-83BD-2A5CDF64F383} = {C5371405-338F-4B70-83BD-2A5CDF64F383}
{77DDC8D7-5B12-4FF2-9629-26AEBCA8436D} = {77DDC8D7-5B12-4FF2-9629-26AEBCA8436D}
{36636678-AE25-4BE6-9A34-2561D1BCF302} = {36636678-AE25-4BE6-9A34-2561D1BCF302}
{A100103A-353E-45E8-A9B8-90B87CC5C0B0} = {A100103A-353E-45E8-A9B8-90B87CC5C0B0}
{3423EC9A-52E4-4A4D-9753-EDEBC38785EF} = {3423EC9A-52E4-4A4D-9753-EDEBC38785EF}
{C27E9A9F-3A17-4482-9C5F-BF15C01E747C} = {C27E9A9F-3A17-4482-9C5F-BF15C01E747C}
{C5371405-338F-4B70-83BD-2A5CDF64F383} = {C5371405-338F-4B70-83BD-2A5CDF64F383}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DocxFormat", "..\..\Common\DocxFormat\Projects\DocxFormat2005.vcproj", "{A100103A-353E-45E8-A9B8-90B87CC5C0B0}"

View File

@ -2624,7 +2624,7 @@ int Binary_tblPrReader::ReadTrPrChange(BYTE type, long length, void* poResult)
int res = c_oSerConstants::ReadOk;
TrackRevision* pTrackRevision = static_cast<TrackRevision*>(poResult);
READ1_TRACKREV(type, length, pTrackRevision)
else if (c_oSerProp_RevisionType::tblPrChange == type)
else if (c_oSerProp_RevisionType::trPrChange == type)
{
pTrackRevision->trPr = new NSStringUtils::CStringBuilder();
READ2_DEF(length, res, this->Read_RowPr, pTrackRevision->trPr);
@ -4080,6 +4080,30 @@ int Binary_DocumentTableReader::ReadDocumentContent(BYTE type, long length, void
READ1_DEF(length, res, this->ReadBookmarkEnd, &oBookmarkEnd);
m_oDocumentWriter.m_oContent.WriteString(oBookmarkEnd.toXML());
}
else if ( c_oSerParType::MoveFromRangeStart == type )
{
OOX::Logic::CMoveFromRangeStart oMoveFromRangeStart;
READ1_DEF(length, res, this->ReadMoveFromRangeStart, &oMoveFromRangeStart);
m_oDocumentWriter.m_oContent.WriteString(oMoveFromRangeStart.toXML());
}
else if ( c_oSerParType::MoveFromRangeEnd == type )
{
OOX::Logic::CMoveFromRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveFromRangeEnd, &oMoveToRangeEnd);
m_oDocumentWriter.m_oContent.WriteString(oMoveToRangeEnd.toXML());
}
else if ( c_oSerParType::MoveToRangeStart == type )
{
OOX::Logic::CMoveToRangeStart oMoveToRangeStart;
READ1_DEF(length, res, this->ReadMoveToRangeStart, &oMoveToRangeStart);
m_oDocumentWriter.m_oContent.WriteString(oMoveToRangeStart.toXML());
}
else if ( c_oSerParType::MoveToRangeEnd == type )
{
OOX::Logic::CMoveToRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveToRangeEnd, &oMoveToRangeEnd);
m_oDocumentWriter.m_oContent.WriteString(oMoveToRangeEnd.toXML());
}
else if(c_oSerParType::JsaProject == type)
{
BYTE* pData = m_oBufferedStream.GetPointer(length);
@ -4922,6 +4946,30 @@ int Binary_DocumentTableReader::ReadMathArg(BYTE type, long length, void* poResu
READ1_DEF(length, res, this->ReadBookmarkEnd, &oBookmarkEnd);
GetRunStringWriter().WriteString(oBookmarkEnd.toXML());
}
else if ( c_oSer_OMathContentType::MoveFromRangeStart == type )
{
OOX::Logic::CMoveFromRangeStart oMoveFromRangeStart;
READ1_DEF(length, res, this->ReadMoveFromRangeStart, &oMoveFromRangeStart);
GetRunStringWriter().WriteString(oMoveFromRangeStart.toXML());
}
else if ( c_oSer_OMathContentType::MoveFromRangeEnd == type )
{
OOX::Logic::CMoveFromRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveFromRangeEnd, &oMoveToRangeEnd);
GetRunStringWriter().WriteString(oMoveToRangeEnd.toXML());
}
else if ( c_oSer_OMathContentType::MoveToRangeStart == type )
{
OOX::Logic::CMoveToRangeStart oMoveToRangeStart;
READ1_DEF(length, res, this->ReadMoveToRangeStart, &oMoveToRangeStart);
GetRunStringWriter().WriteString(oMoveToRangeStart.toXML());
}
else if ( c_oSer_OMathContentType::MoveToRangeEnd == type )
{
OOX::Logic::CMoveToRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveToRangeEnd, &oMoveToRangeEnd);
GetRunStringWriter().WriteString(oMoveToRangeEnd.toXML());
}
else
res = c_oSerConstants::ReadUnknown;
return res;
@ -7161,7 +7209,7 @@ int Binary_DocumentTableReader::ReadRunContent(BYTE type, long length, void* poR
if(NULL != m_pComments)
{
CComment* pComment = m_pComments->get(nId);
if(NULL != pComment && pComment->bIdFormat)
if(NULL != pComment) // могут быть и без start/end
{
GetRunStringWriter().WriteString(pComment->writeRef(std::wstring(_T("")), std::wstring(_T("w:commentReference")), std::wstring(_T(""))));
}
@ -7407,6 +7455,30 @@ int Binary_DocumentTableReader::Read_TableContent(BYTE type, long length, void*
READ1_DEF(length, res, this->ReadBookmarkEnd, &oBookmarkEnd);
pCStringWriter->WriteString(oBookmarkEnd.toXML());
}
else if ( c_oSerDocTableType::MoveFromRangeStart == type )
{
OOX::Logic::CMoveFromRangeStart oMoveFromRangeStart;
READ1_DEF(length, res, this->ReadMoveFromRangeStart, &oMoveFromRangeStart);
pCStringWriter->WriteString(oMoveFromRangeStart.toXML());
}
else if ( c_oSerDocTableType::MoveFromRangeEnd == type )
{
OOX::Logic::CMoveFromRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveFromRangeEnd, &oMoveToRangeEnd);
pCStringWriter->WriteString(oMoveToRangeEnd.toXML());
}
else if ( c_oSerDocTableType::MoveToRangeStart == type )
{
OOX::Logic::CMoveToRangeStart oMoveToRangeStart;
READ1_DEF(length, res, this->ReadMoveToRangeStart, &oMoveToRangeStart);
pCStringWriter->WriteString(oMoveToRangeStart.toXML());
}
else if ( c_oSerDocTableType::MoveToRangeEnd == type )
{
OOX::Logic::CMoveToRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveToRangeEnd, &oMoveToRangeEnd);
pCStringWriter->WriteString(oMoveToRangeEnd.toXML());
}
else
res = c_oSerConstants::ReadUnknown;
return res;
@ -7456,6 +7528,30 @@ int Binary_DocumentTableReader::ReadRowContent(BYTE type, long length, void* poR
READ1_DEF(length, res, this->ReadBookmarkEnd, &oBookmarkEnd);
pCStringWriter->WriteString(oBookmarkEnd.toXML());
}
else if ( c_oSerDocTableType::MoveFromRangeStart == type )
{
OOX::Logic::CMoveFromRangeStart oMoveFromRangeStart;
READ1_DEF(length, res, this->ReadMoveFromRangeStart, &oMoveFromRangeStart);
pCStringWriter->WriteString(oMoveFromRangeStart.toXML());
}
else if ( c_oSerDocTableType::MoveFromRangeEnd == type )
{
OOX::Logic::CMoveFromRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveFromRangeEnd, &oMoveToRangeEnd);
pCStringWriter->WriteString(oMoveToRangeEnd.toXML());
}
else if ( c_oSerDocTableType::MoveToRangeStart == type )
{
OOX::Logic::CMoveToRangeStart oMoveToRangeStart;
READ1_DEF(length, res, this->ReadMoveToRangeStart, &oMoveToRangeStart);
pCStringWriter->WriteString(oMoveToRangeStart.toXML());
}
else if ( c_oSerDocTableType::MoveToRangeEnd == type )
{
OOX::Logic::CMoveToRangeEnd oMoveToRangeEnd;
READ1_DEF(length, res, this->ReadMoveToRangeEnd, &oMoveToRangeEnd);
pCStringWriter->WriteString(oMoveToRangeEnd.toXML());
}
else
res = c_oSerConstants::ReadUnknown;
return res;

View File

@ -524,7 +524,11 @@ extern int g_nCurFormatVersion;
Sdt = 10,
BookmarkStart = 11,
BookmarkEnd = 12,
tblGrid_ItemTwips = 13
tblGrid_ItemTwips = 13,
MoveFromRangeStart = 14,
MoveFromRangeEnd = 15,
MoveToRangeStart = 16,
MoveToRangeEnd = 17
};}
namespace c_oSerRunType{enum c_oSerRunType
{
@ -979,7 +983,11 @@ extern int g_nCurFormatVersion;
columnbreak = 64,
ARPr = 65,
BookmarkStart = 66,
BookmarkEnd = 67
BookmarkEnd = 67,
MoveFromRangeStart = 68,
MoveFromRangeEnd = 69,
MoveToRangeStart = 70,
MoveToRangeEnd = 71
};}
namespace c_oSer_FramePrType{ enum c_oSer_FramePrType
{

View File

@ -801,7 +801,7 @@ void Binary_rPrWriter::Write_rPrChange(const OOX::Logic::CRPrChange& rPrChange)
if(rPrChange.m_pRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::rPrChange);
Write_rPr(rPrChange.m_pRunPr.operator->());
Write_rPr(rPrChange.m_pRunPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
@ -944,7 +944,7 @@ void Binary_pPrWriter::Write_pPr(const OOX::Logic::CParagraphProperty& pPr)
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::pPr_rPr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
brPrs.Write_rPr(pPr.m_oRPr.operator->());
brPrs.Write_rPr(pPr.m_oRPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//FramePr
@ -1425,7 +1425,7 @@ void Binary_pPrWriter::WriteHeaderFooter(OOX::Logic::CSectionProperty* pSectPr,
if (oFile.IsInit() && (OOX::FileTypes::Header == oFile->type() || OOX::FileTypes::Footer == oFile->type()))
{
int nIndex = 0;
OOX::CHdrFtr* pHdrFtr = (OOX::CHdrFtr*)oFile.operator->();
OOX::CHdrFtr* pHdrFtr = (OOX::CHdrFtr*)oFile.GetPointer();
if(bHdr)
{
nIndex = (int)m_oBinaryHeaderFooterTableWriter->m_aHeaders.size();
@ -2264,7 +2264,7 @@ void Binary_tblPrWriter::WriteTcPrChange(const OOX::Logic::CTcPrChange& tcPrChan
if(tcPrChange.m_pTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::tcPrChange);
WriteCellPr(tcPrChange.m_pTcPr.operator->());
WriteCellPr(tcPrChange.m_pTcPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
@ -2452,7 +2452,7 @@ void BinaryStyleTableWriter::WriteStyle(const OOX::CStyle& style)
if(false != style.m_oRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_TextPr);
brPrs.Write_rPr(style.m_oRunPr.operator->());
brPrs.Write_rPr(style.m_oRunPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
//ParaPr
@ -2480,7 +2480,7 @@ void BinaryStyleTableWriter::WriteStyle(const OOX::CStyle& style)
if(false != style.m_oTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_CellPr);
btblPrs.WriteCellPr(style.m_oTcPr.operator->());
btblPrs.WriteCellPr(style.m_oTcPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
//TblStylePr
@ -2557,7 +2557,7 @@ void BinaryStyleTableWriter::WriteTblStyleProperties(const OOX::Logic::CTableSty
if(false != oProperty.m_oRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::RunPr);
brPrs.Write_rPr(oProperty.m_oRunPr.operator->());
brPrs.Write_rPr(oProperty.m_oRunPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
//ParaPr
@ -2585,7 +2585,7 @@ void BinaryStyleTableWriter::WriteTblStyleProperties(const OOX::Logic::CTableSty
if(false != oProperty.m_oTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::TcPr);
btblPrs.WriteCellPr(oProperty.m_oTcPr.operator->());
btblPrs.WriteCellPr(oProperty.m_oTcPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
}
@ -3082,6 +3082,34 @@ void BinaryDocumentTableWriter::WriteDocumentContent(const std::vector<OOX::Writ
WriteBookmarkEnd(*pBookmarkEnd);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}break;
case OOX::et_w_moveFromRangeStart:
{
OOX::Logic::CMoveFromRangeStart* pMoveFromRangeStart = static_cast<OOX::Logic::CMoveFromRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveFromRangeStart);
WriteMoveRangeStart(*pMoveFromRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
}break;
case OOX::et_w_moveFromRangeEnd:
{
OOX::Logic::CMoveFromRangeEnd* pMoveFromRangeEnd = static_cast<OOX::Logic::CMoveFromRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveFromRangeEnd);
WriteMoveRangeEnd(*pMoveFromRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
}break;
case OOX::et_w_moveToRangeStart:
{
OOX::Logic::CMoveToRangeStart* pMoveToRangeStart = static_cast<OOX::Logic::CMoveToRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveToRangeStart);
WriteMoveRangeStart(*pMoveToRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
}break;
case OOX::et_w_moveToRangeEnd:
{
OOX::Logic::CMoveToRangeEnd* pMoveToRangeEnd = static_cast<OOX::Logic::CMoveToRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveToRangeEnd);
WriteMoveRangeEnd(*pMoveToRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
}break;
default:
break;
}
@ -3285,39 +3313,38 @@ void BinaryDocumentTableWriter::WriteParagraphContent(const std::vector<OOX::Wri
m_oBcw.WriteItemEnd(nCurPos);
break;
}
//todo moveRange on all levels(body, p ...)
// case OOX::et_w_moveFromRangeStart:
// {
// OOX::Logic::CMoveFromRangeStart* pMoveFromRangeStart = static_cast<OOX::Logic::CMoveFromRangeStart*>(item);
// nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveFromRangeStart);
// WriteMoveRangeStart(*pMoveFromRangeStart);
// m_oBcw.WriteItemEnd(nCurPos);
// break;
// }
// case OOX::et_w_moveFromRangeEnd:
// {
// OOX::Logic::CMoveFromRangeEnd* pMoveFromRangeEnd = static_cast<OOX::Logic::CMoveFromRangeEnd*>(item);
// nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveFromRangeEnd);
// WriteMoveRangeEnd(*pMoveFromRangeEnd);
// m_oBcw.WriteItemEnd(nCurPos);
// break;
// }
// case OOX::et_w_moveToRangeStart:
// {
// OOX::Logic::CMoveToRangeStart* pMoveToRangeStart = static_cast<OOX::Logic::CMoveToRangeStart*>(item);
// nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveToRangeStart);
// WriteMoveRangeStart(*pMoveToRangeStart);
// m_oBcw.WriteItemEnd(nCurPos);
// break;
// }
// case OOX::et_w_moveToRangeEnd:
// {
// OOX::Logic::CMoveToRangeEnd* pMoveToRangeEnd = static_cast<OOX::Logic::CMoveToRangeEnd*>(item);
// nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveToRangeEnd);
// WriteMoveRangeEnd(*pMoveToRangeEnd);
// m_oBcw.WriteItemEnd(nCurPos);
// break;
// }
case OOX::et_w_moveFromRangeStart:
{
OOX::Logic::CMoveFromRangeStart* pMoveFromRangeStart = static_cast<OOX::Logic::CMoveFromRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveFromRangeStart);
WriteMoveRangeStart(*pMoveFromRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_moveFromRangeEnd:
{
OOX::Logic::CMoveFromRangeEnd* pMoveFromRangeEnd = static_cast<OOX::Logic::CMoveFromRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveFromRangeEnd);
WriteMoveRangeEnd(*pMoveFromRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_moveToRangeStart:
{
OOX::Logic::CMoveToRangeStart* pMoveToRangeStart = static_cast<OOX::Logic::CMoveToRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveToRangeStart);
WriteMoveRangeStart(*pMoveToRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_moveToRangeEnd:
{
OOX::Logic::CMoveToRangeEnd* pMoveToRangeEnd = static_cast<OOX::Logic::CMoveToRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerParType::MoveToRangeEnd);
WriteMoveRangeEnd(*pMoveToRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_m_oMathPara:
{
OOX::Logic::COMathPara* pOMathPara = static_cast<OOX::Logic::COMathPara*>(item);
@ -4222,6 +4249,38 @@ void BinaryDocumentTableWriter::WriteMathArgNodes(const std::vector<OOX::Writing
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_moveFromRangeStart:
{
OOX::Logic::CMoveFromRangeStart* pMoveFromRangeStart = static_cast<OOX::Logic::CMoveFromRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MoveFromRangeStart);
WriteMoveRangeStart(*pMoveFromRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_moveFromRangeEnd:
{
OOX::Logic::CMoveFromRangeEnd* pMoveFromRangeEnd = static_cast<OOX::Logic::CMoveFromRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MoveFromRangeEnd);
WriteMoveRangeEnd(*pMoveFromRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_moveToRangeStart:
{
OOX::Logic::CMoveToRangeStart* pMoveToRangeStart = static_cast<OOX::Logic::CMoveToRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MoveToRangeStart);
WriteMoveRangeStart(*pMoveToRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
case OOX::et_w_moveToRangeEnd:
{
OOX::Logic::CMoveToRangeEnd* pMoveToRangeEnd = static_cast<OOX::Logic::CMoveToRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSer_OMathContentType::MoveToRangeEnd);
WriteMoveRangeEnd(*pMoveToRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
break;
}
default:
break;
}
@ -4234,7 +4293,7 @@ void BinaryDocumentTableWriter::WriteMathRunContent(OOX::Logic::CMRun* pMRun)
if ( pMRun->m_oRPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::RPr);
brPrs.Write_rPr(pMRun->m_oRPr.operator->());
brPrs.Write_rPr(pMRun->m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pMRun->m_oARPr.IsInit() )
@ -4483,7 +4542,7 @@ void BinaryDocumentTableWriter::WriteMathCtrlPr(const OOX::Logic::CCtrlPr &pCtrl
if ( pCtrlPr.m_oRPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::rPr);
brPrs.Write_rPr(pCtrlPr.m_oRPr.operator->());
brPrs.Write_rPr(pCtrlPr.m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pCtrlPr.m_oARPr.IsInit() )
@ -6806,6 +6865,34 @@ void BinaryDocumentTableWriter::WriteTableContent(std::vector<OOX::WritingElemen
WriteBookmarkEnd(*pBookmarkEnd);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
else if(OOX::et_w_moveFromRangeStart == item->getType())
{
OOX::Logic::CMoveFromRangeStart* pMoveFromRangeStart = static_cast<OOX::Logic::CMoveFromRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveFromRangeStart);
WriteMoveRangeStart(*pMoveFromRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
}
else if(OOX::et_w_moveFromRangeEnd == item->getType())
{
OOX::Logic::CMoveFromRangeEnd* pMoveFromRangeEnd = static_cast<OOX::Logic::CMoveFromRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveFromRangeEnd);
WriteMoveRangeEnd(*pMoveFromRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
}
else if(OOX::et_w_moveToRangeStart == item->getType())
{
OOX::Logic::CMoveToRangeStart* pMoveToRangeStart = static_cast<OOX::Logic::CMoveToRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveToRangeStart);
WriteMoveRangeStart(*pMoveToRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
}
else if(OOX::et_w_moveToRangeEnd == item->getType())
{
OOX::Logic::CMoveToRangeEnd* pMoveToRangeEnd = static_cast<OOX::Logic::CMoveToRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveToRangeEnd);
WriteMoveRangeEnd(*pMoveToRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void BinaryDocumentTableWriter::WriteRow(const OOX::Logic::CTr& Row, OOX::Logic::CTableProperty* pTblPr, int nCurRowIndex, int nRows, int nCols)
@ -6880,6 +6967,34 @@ void BinaryDocumentTableWriter::WriteRowContent(const std::vector<OOX::WritingEl
WriteBookmarkEnd(*pBookmarkEnd);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
else if(OOX::et_w_moveFromRangeStart == item->getType())
{
OOX::Logic::CMoveFromRangeStart* pMoveFromRangeStart = static_cast<OOX::Logic::CMoveFromRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveFromRangeStart);
WriteMoveRangeStart(*pMoveFromRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
}
else if(OOX::et_w_moveFromRangeEnd == item->getType())
{
OOX::Logic::CMoveFromRangeEnd* pMoveFromRangeEnd = static_cast<OOX::Logic::CMoveFromRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveFromRangeEnd);
WriteMoveRangeEnd(*pMoveFromRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
}
else if(OOX::et_w_moveToRangeStart == item->getType())
{
OOX::Logic::CMoveToRangeStart* pMoveToRangeStart = static_cast<OOX::Logic::CMoveToRangeStart*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveToRangeStart);
WriteMoveRangeStart(*pMoveToRangeStart);
m_oBcw.WriteItemEnd(nCurPos);
}
else if(OOX::et_w_moveToRangeEnd == item->getType())
{
OOX::Logic::CMoveToRangeEnd* pMoveToRangeEnd = static_cast<OOX::Logic::CMoveToRangeEnd*>(item);
nCurPos = m_oBcw.WriteItemStart(c_oSerDocTableType::MoveToRangeEnd);
WriteMoveRangeEnd(*pMoveToRangeEnd);
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void BinaryDocumentTableWriter::WriteCell(OOX::Logic::CTc& tc, OOX::Logic::CTableProperty* pTblPr, int nCurRowIndex, int nCurColIndex, int nRows, int nCols)
@ -6913,7 +7028,7 @@ void BinaryDocumentTableWriter::WriteSdt(OOX::Logic::CSdt* pStd, int type, OOX::
if(pStd->m_oSdtEndPr.IsInit() && pStd->m_oSdtEndPr->m_oRPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::EndPr);
brPrs.Write_rPr(pStd->m_oSdtEndPr->m_oRPr.operator->());
brPrs.Write_rPr(pStd->m_oSdtEndPr->m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
if(pStd->m_oSdtContent.IsInit())
@ -7037,7 +7152,7 @@ void BinaryDocumentTableWriter::WriteSdtPr(const OOX::Logic::CSdtPr& oStdPr)
if(oStdPr.m_oRPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::RPr);
brPrs.Write_rPr(oStdPr.m_oRPr.operator->());
brPrs.Write_rPr(oStdPr.m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oStdPr.m_oShowingPlcHdr.IsInit())

View File

@ -277,13 +277,20 @@ namespace BinXlsxRW{
pTable->m_oTable->m_oTableStyleInfo->m_oShowColumnStripes.Init();
pTable->m_oTable->m_oTableStyleInfo->m_oShowColumnStripes->FromBool(false);
pTable->m_oTable->m_oTableColumns.Init();
for(size_t i = 0; i < m_aTableNames.size(); ++i)
{
OOX::Spreadsheet::CTableColumn* pTableColumn = new OOX::Spreadsheet::CTableColumn();
pTableColumn->m_oId.Init();
pTableColumn->m_oId->SetValue((unsigned int)i + 1);
pTableColumn->m_oName.Init();
pTableColumn->m_oName->append(m_aTableNames[i]);
if (!pTableColumn->m_oId.IsInit())
{
pTableColumn->m_oId.Init();
pTableColumn->m_oId->SetValue((unsigned int)i + 1);
}
if (!pTableColumn->m_oName.IsInit())
{
pTableColumn->m_oName = m_aTableNames[i];
}
pTable->m_oTable->m_oTableColumns->m_arrItems.push_back(pTableColumn);
}
pTable->m_oTable->m_oTableColumns->m_oCount.Init();

View File

@ -92,8 +92,9 @@ public:
std::wstring convert_conditional_formula(std::wstring const & expr);
// Лист1!$A$1 -> $Лист1.$A$1
std::wstring convert_named_ref (std::wstring const & expr);
std::wstring convert_named_ref(std::wstring const & expr);
std::wstring convert_named_formula(std::wstring const & expr);
bool is_simple_ref(std::wstring const & expr);
std::wstring get_table_name();

View File

@ -210,25 +210,41 @@ namespace formulasconvert {
bool odf2oox_converter::Impl::find_first_last_ref(std::wstring const & expr, std::wstring & table,std::wstring & ref_first,std::wstring & ref_last)
{
std::wstring workstr = expr;
workstr = boost::regex_replace(
workstr,
boost::wregex(L"('.*?')|(\".*?\")"),
&convert_scobci, boost::match_default | boost::format_all);
std::vector< std::wstring > splitted;
boost::algorithm::split(splitted, expr, boost::algorithm::is_any_of(L".:"), boost::algorithm::token_compress_on);
boost::algorithm::split(splitted, workstr, boost::algorithm::is_any_of(L".:"), boost::algorithm::token_compress_on);
bool res = false;
if (splitted.size() == 2)
{
table = splitted[0];
ref_first = splitted[1];
ref_last = splitted[1];
res = true;
}
if (splitted.size() == 3)
{
table = splitted[0];
ref_first = splitted[1];
ref_last = splitted[2];
return true;
res = true;
}
if (splitted.size() == 4)
{
table = splitted[0];
ref_first = splitted[1];
ref_last = splitted[3];
return true;
res = true;
}
return false;
replace_tmp_back( table );
return res;
}
bool odf2oox_converter::Impl::find_first_ref(std::wstring const & expr, std::wstring & table, std::wstring & ref)

View File

@ -174,6 +174,7 @@ public:
}
void replace_named_ref(std::wstring & expr);
void replace_named_formula(std::wstring & expr);
bool is_simple_ref(std::wstring const & expr);
static bool isFindBaseCell_;
@ -188,14 +189,14 @@ void oox2odf_converter::Impl::replace_cells_range(std::wstring& expr, bool bSele
if ((0 == expr.find(L"KAVYCHKA")) && (expr.length() - 8 == expr.rfind(L"KAVYCHKA") ))
return;
boost::wregex re(L"([:$!])+");
boost::wregex re(L"(([:$!])+)|(\\S+\\d+)");
boost::wsmatch result;
bool b = boost::regex_search(expr, result, re);
if (b)
{
boost::wregex re1(L"(\\$?[^\']+\\!)?([\\w^0-9$]*\\d*)\\:?([\\w^0-9$]*\\d*)?");
boost::wregex re1(L"(\\$?[^\\']+\\!)?([a-zA-Z$]+\\d*)(\\:[a-zA-Z$]+\\d*)?");
// $ Sheet2 ! $ A1 : $ B5
// $ Sheet2 ! $ A : $ A
// $ Sheet2 ! $ 1 : $ 1
@ -238,9 +239,11 @@ std::wstring oox2odf_converter::Impl::replace_cells_range_formater1(boost::wsmat
if (isFindBaseCell_ && table_name_.empty() && !sheet.empty())
{
table_name_ = sheet + L".$A$1";
table_name_ = L"$" + sheet + L".$A$1";
}
if (!sheet.empty() && (std::wstring::npos != c1.find(L"$"))) sheet = L"$" + sheet;
if (!c2.empty() && c2.substr(0, 1) == L":")
c2 = c2.substr(1);
s = L"[" + sheet + L"." + c1 + (c2.empty() ? L"" : (L":" + sheet + L"." + c2)) + std::wstring(L"]");
@ -281,10 +284,12 @@ std::wstring oox2odf_converter::Impl::replace_cells_range_formater2(boost::wsmat
if (isFindBaseCell_ && table_name_.empty() && !sheet.empty())
{
table_name_ = sheet + L".$A$1";
table_name_ = L"$" + sheet + L".$A$1";
}
if (!sheet.empty() && (std::wstring::npos != c1.find(L"$"))) sheet = L"$" + sheet;
if (!c2.empty() && c2.substr(0, 1) == L":")
c2 = c2.substr(1);
s = sheet + L"." + c1 + (c2.empty() ? L"" : (L":" + sheet + L"." + c2)) + std::wstring(L"");
}
@ -310,6 +315,19 @@ void oox2odf_converter::Impl::replace_named_formula(std::wstring & expr)
expr = convert_formula(expr);
isFindBaseCell_ = false;
}
bool oox2odf_converter::Impl::is_simple_ref(std::wstring const & expr)
{
if (expr.find(L"(") != std::wstring::npos) return false;
if (expr.find(L" ") != std::wstring::npos) return false;
if (expr.find(L";") != std::wstring::npos) return false;
boost::wsmatch match;
if (boost::regex_search(expr, match, boost::wregex(L"([\\w]+\\!)?\\$?[a-zA-Z]+\\$?\\d+(\\:\\$?[a-zA-Z]+\\$?\\d+)?")))
{
return true;
}
return false;
}
void oox2odf_converter::Impl::replace_named_ref(std::wstring & expr)
{
@ -644,6 +662,11 @@ std::wstring oox2odf_converter::convert_named_formula(const std::wstring& expr)
impl_->replace_named_formula(workstr);
return workstr;
}
bool oox2odf_converter::is_simple_ref(std::wstring const & expr)
{
return impl_->is_simple_ref(expr);
}
std::wstring oox2odf_converter::get_table_name()
{
return impl_->table_name_;

View File

@ -63,8 +63,9 @@ public:
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) = 0;
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes ) = 0;
virtual void add_attributes (const xml::attributes_wc_ptr & Attributes) = 0;
virtual void add_text (const std::wstring & Text) = 0;
virtual void add_space (const std::wstring & Text) = 0;
};

View File

@ -468,6 +468,7 @@ enum ElementType
typeDrawHandle,
typeDrawEquation,
typeDrawEnhancedGeometry,
typeDrawGluePoint,
typeDr3dScene,
typeDr3dLight,
@ -506,6 +507,7 @@ enum ElementType
typeFormTime,
typeFormValueRange,
typeFormItem,
typeFormOption,
typeDrawPage,
typePresentationFooterDecl,

View File

@ -82,6 +82,11 @@ bool read_doc_element::read_sax( xml::sax * Reader )
}
break;
case xml::typeWhitespace:
{
const std::wstring value = Reader->value();
add_space(value);
}
break;
case xml::typeText:
{
const std::wstring value = Reader->value();

View File

@ -144,7 +144,7 @@ docx_conversion_context::docx_conversion_context(odf_reader::odf_document * _odf
text_tracked_context_ (*this),
table_context_ (*this),
output_document_ (NULL),
process_note_ (noNote),
current_process_note_ (noNote),
new_list_style_number_ (0),
current_margin_left_ (0),
current_outline_level_ (-1),
@ -152,7 +152,7 @@ docx_conversion_context::docx_conversion_context(odf_reader::odf_document * _odf
is_delete_text_ (false),
delayed_converting_ (false),
process_headers_footers_ (false),
process_comment_ (false),
current_process_comment_ (false),
odf_document_ (_odf_document),
math_context_ (_odf_document->odf_context().fontContainer(), false)
{
@ -622,9 +622,9 @@ std::wstring docx_conversion_context::add_hyperlink(const std::wstring & href, b
{
hyperlinks::_type_place type = hyperlinks::document_place;
if (process_comment_ == true) type = hyperlinks::comment_place;
else if (process_note_ == footNote || process_note_ == footNoteRefSet) type = hyperlinks::footnote_place;
else if (process_note_ == endNote || process_note_ == endNoteRefSet ) type = hyperlinks::endnote_place;
if (current_process_comment_ == true) type = hyperlinks::comment_place;
else if (current_process_note_ == footNote || current_process_note_ == footNoteRefSet) type = hyperlinks::footnote_place;
else if (current_process_note_ == endNote || current_process_note_ == endNoteRefSet ) type = hyperlinks::endnote_place;
std::wstring href_correct = xml::utils::replace_text_to_xml(href);
XmlUtils::replace_all( href_correct, L" .", L".");//1 (130).odt
@ -694,7 +694,7 @@ void docx_conversion_context::end_document()
output_document_->get_word_files().set_comments ( comments_context_);
output_document_->get_word_files().set_headers_footers( headers_footers_);
package::xl_drawings_ptr drawings = package::xl_drawings::create(chart_drawing_handle_->content());
package::xl_drawings_ptr drawings = package::xl_drawings::create(chart_drawing_handle_->content(), chart_drawing_handle_->content_vml());
output_document_->get_word_files().set_drawings(drawings);
package::content_types_file & content_file_ = output_document_->get_content_types_file();
@ -1077,7 +1077,7 @@ void docx_conversion_context::process_styles()
const std::wstring displayName = StyleDisplayName(arStyles[i]->name(), arStyles[i]->display_name(), arStyles[i]->type());
_Wostream << L"<w:name w:val=\"" << displayName << L"\"/>";
_Wostream << L"<w:name w:val=\"" << XmlUtils::EncodeXmlString(displayName) << L"\"/>";
if (odf_reader::style_instance * baseOn = arStyles[i]->parent())
{
@ -1470,7 +1470,7 @@ void docx_conversion_context::end_text_list_style()
text_list_style_name_ = L"";
}
const std::wstring & docx_conversion_context::get_text_list_style_name()
std::wstring docx_conversion_context::get_text_list_style_name()
{
return text_list_style_name_;
}
@ -1496,9 +1496,9 @@ void docx_conversion_context::end_list()
list_style_stack_.pop_back();
}
const std::wstring docx_conversion_context::current_list_style() const
std::wstring docx_conversion_context::current_list_style()
{
if (!list_style_stack_.empty())
if (false == list_style_stack_.empty())
return list_style_stack_.back();
else
return L"";
@ -1551,6 +1551,93 @@ int docx_conversion_context::process_text_attr(odf_reader::text::paragraph_attrs
push_text_properties(styleContent->get_style_text_properties());
return 1;
}
int docx_conversion_context::process_paragraph_style(const std::wstring & style_name)
{
if (style_name.empty()) return 0;
if (odf_reader::style_instance * styleInst =
root()->odf_context().styleContainer().style_by_name(style_name, odf_types::style_family::Paragraph, process_headers_footers_))
{
double font_size = odf_reader::text_format_properties_content::process_font_size_impl(odf_types::font_size(odf_types::percent(100.0)), styleInst);
if (font_size > 0) current_fontSize.push_back(font_size);
process_page_break_after(styleInst);
if (styleInst->is_automatic())
{
if (odf_reader::style_content * styleContent = styleInst->content())
{
std::wstring id;
//office_element_ptr parent_tab_stops_;
if (const odf_reader::style_instance * parentStyleContent = styleInst->parent())
{
std::wstring parent_name = parentStyleContent->name();
id = styles_map_.get( parent_name, parentStyleContent->type() );
if (in_table_content_ && table_content_context_.empty_current_table_content_level_index())
{
table_content_context_.set_current_level(parent_name);
}
}
start_automatic_style(id);
calc_tab_stops(styleInst, get_tabs_context());
//вытаскивает rtl c цепочки стилей !! - просто прописать в наследуемом НЕЛЬЗЯ !!
odf_reader::paragraph_format_properties properties = odf_reader::calc_paragraph_properties_content(styleInst);
if (properties.style_writing_mode_)
{
odf_types::writing_mode::type type = properties.style_writing_mode_->get_type();
switch(type)
{
case odf_types::writing_mode::RlTb:
case odf_types::writing_mode::TbRl:
case odf_types::writing_mode::Rl:
set_rtl(true);
break;
default:
set_rtl(false);
}
}
set_margin_left(properties.fo_margin_left_? 20.0 * properties.fo_margin_left_->get_length().get_value_unit(odf_types::length::pt) : 0);
styleContent->docx_convert(*this);
end_automatic_style();
//push_text_properties(styleContent->get_style_text_properties());
return 1;
}
}
else
{
const std::wstring id = styles_map_.get( styleInst->name(), styleInst->type() );
output_stream() << L"<w:pPr>";
output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
if (!get_text_tracked_context().dumpPPr_.empty())
{
output_stream() << get_text_tracked_context().dumpPPr_;
get_text_tracked_context().dumpPPr_.clear();
}
serialize_list_properties(output_stream());
if (!get_text_tracked_context().dumpRPrInsDel_.empty())
{
output_stream() << L"<w:rPr>";
output_stream() << get_text_tracked_context().dumpRPrInsDel_;
get_text_tracked_context().dumpRPrInsDel_.clear();
output_stream() << L"</w:rPr>";
}
output_stream() << L"</w:pPr>";
return 2;
}
}
return 0;
}
int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_attrs *Attr)
{
if (!Attr) return 0;
@ -1571,19 +1658,22 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
if (odf_reader::style_instance * styleInst =
root()->odf_context().styleContainer().style_by_name(Attr->text_style_name_, odf_types::style_family::Paragraph, process_headers_footers_)
)
{
process_page_break_after(styleInst);
{
double font_size = odf_reader::text_format_properties_content::process_font_size_impl(odf_types::font_size(odf_types::percent(100.0)), styleInst);
if (font_size > 0) current_fontSize.push_back(font_size);
process_page_break_after(styleInst);
if (styleInst->is_automatic())
{
if (odf_reader::style_content * styleContent = styleInst->content())
{
std::wstring id;
{
if (odf_reader::style_content * styleContent = styleInst->content())
{
std::wstring id;
//office_element_ptr parent_tab_stops_;
if (const odf_reader::style_instance * parentStyleContent = styleInst->parent())
if (const odf_reader::style_instance * parentStyleContent = styleInst->parent())
{
std::wstring parent_name = parentStyleContent->name();
id = styles_map_.get( parent_name, parentStyleContent->type() );
id = styles_map_.get( parent_name, parentStyleContent->type() );
if (in_table_content_ && table_content_context_.empty_current_table_content_level_index())
{
@ -1591,7 +1681,7 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
}
}
start_automatic_style(id);
start_automatic_style(id);
calc_tab_stops(styleInst, get_tabs_context());
@ -1617,10 +1707,10 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
set_outline_level(*Attr->outline_level_ - 1);
}
styleContent->docx_convert(*this);
end_automatic_style();
push_text_properties(styleContent->get_style_text_properties());
push_text_properties(styleContent->get_style_text_properties());
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
@ -1636,6 +1726,8 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
//process_paragraph_style(Context.get_current_paragraph_style()); ??
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
output_stream() << L"<w:pPr>";
@ -1655,58 +1747,58 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
}
}
return 1;
}
}
else
{
const std::wstring id = styles_map_.get( styleInst->name(), styleInst->type() );
output_stream() << L"<w:pPr>";
//todooo причесать
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
&& (get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
}
}
else
{
const std::wstring id = styles_map_.get( styleInst->name(), styleInst->type() );
output_stream() << L"<w:pPr>";
//todooo причесать
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
&& (get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{
if (is_paragraph_header() )
{
if (is_paragraph_header() )
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
output_stream() << L"<w:pPr>";
}
else
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
}
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
output_stream() << L"<w:pPr>";
}
output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
if (!get_text_tracked_context().dumpPPr_.empty())
else
{
output_stream() << get_text_tracked_context().dumpPPr_;
get_text_tracked_context().dumpPPr_.clear();
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
}
}
serialize_list_properties(output_stream());
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\" />";
}
output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
if (!get_text_tracked_context().dumpRPrInsDel_.empty())
{
output_stream() << L"<w:rPr>";
output_stream() << get_text_tracked_context().dumpRPrInsDel_;
get_text_tracked_context().dumpRPrInsDel_.clear();
output_stream() << L"</w:rPr>";
}
output_stream() << L"</w:pPr>";
if (!get_text_tracked_context().dumpPPr_.empty())
{
output_stream() << get_text_tracked_context().dumpPPr_;
get_text_tracked_context().dumpPPr_.clear();
}
serialize_list_properties(output_stream());
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\" />";
}
if (!get_text_tracked_context().dumpRPrInsDel_.empty())
{
output_stream() << L"<w:rPr>";
output_stream() << get_text_tracked_context().dumpRPrInsDel_;
get_text_tracked_context().dumpRPrInsDel_.clear();
output_stream() << L"</w:rPr>";
}
output_stream() << L"</w:pPr>";
return 2;
}
}
@ -1757,28 +1849,27 @@ void docx_conversion_context::process_page_break_after(const odf_reader::style_i
}
void docx_conversion_context::serialize_list_properties(std::wostream & strm)
{
if (!list_style_stack_.empty())
if (list_style_stack_.empty()) return;
if (first_element_list_item_)
{
if (first_element_list_item_)
{
const int id = root()->odf_context().listStyleContainer().id_by_name( current_list_style() );
const int id = root()->odf_context().listStyleContainer().id_by_name( current_list_style() );
CP_XML_WRITER(strm)
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"w:numPr")
{
CP_XML_NODE(L"w:numPr")
CP_XML_NODE(L"w:ilvl")
{
CP_XML_NODE(L"w:ilvl")
{
CP_XML_ATTR(L"w:val", (list_style_stack_.size() - 1));
}
CP_XML_NODE(L"w:numId")
{
CP_XML_ATTR(L"w:val", id );
}
CP_XML_ATTR(L"w:val", (list_style_stack_.size() - 1));
}
CP_XML_NODE(L"w:numId")
{
CP_XML_ATTR(L"w:val", id );
}
}
first_element_list_item_ = false;
}
}
first_element_list_item_ = false;
}
}
@ -1944,12 +2035,12 @@ void notes_context::dump_rels(rels & Rels) const
void docx_conversion_context::add_note_reference ()
{
if (process_note_ == footNote || process_note_ == endNote)
if (current_process_note_ == footNote || current_process_note_ == endNote)
{
add_element_to_run(_T(""));
output_stream() << ((process_note_ == footNote) ? L"<w:footnoteRef />" : L"<w:endnoteRef />");
output_stream() << ((current_process_note_ == footNote) ? L"<w:footnoteRef />" : L"<w:endnoteRef />");
finish_run();
process_note_ = (NoteType) (process_note_ + 1); //add ref set
current_process_note_ = (NoteType) (current_process_note_ + 1); //add ref set
}
}
@ -1998,7 +2089,7 @@ void docx_conversion_context::start_text_changes (const std::wstring &id)
void docx_conversion_context::start_changes()
{
if (map_current_changes_.empty()) return;
if (process_comment_) return;
if (current_process_comment_) return;
text_tracked_context_.dumpPPr_.clear();
text_tracked_context_.dumpRPr_.clear();
@ -2097,7 +2188,7 @@ void docx_conversion_context::start_changes()
void docx_conversion_context::end_changes()
{
if (process_comment_) return;
if (current_process_comment_) return;
for (map_changes_iterator it = map_current_changes_.begin(); it != map_current_changes_.end(); ++it)
{

View File

@ -830,6 +830,7 @@ public:
bool process_page_properties(std::wostream & strm);
void process_section (std::wostream & strm, odf_reader::style_columns * columns = NULL);
int process_paragraph_style (const std::wstring & style_name);
int process_paragraph_attr (odf_reader::text::paragraph_attrs *attr);
int process_text_attr (odf_reader::text::paragraph_attrs *Attr);
void process_page_break_after(const odf_reader::style_instance *styleInst);
@ -873,8 +874,8 @@ public:
void start_text_list_style (const std::wstring & StyleName);
void end_text_list_style ();
const std::wstring & get_text_list_style_name();
const std::wstring current_list_style () const;
std::wstring get_text_list_style_name();
std::wstring current_list_style();
void start_list (const std::wstring & StyleName, bool Continue = false);
void end_list ();
@ -912,26 +913,32 @@ public:
StreamsManPtr get_stream_man() const { return streams_man_; }
void set_stream_man(StreamsManPtr Sm) { streams_man_ = Sm; }
void set_rtl(bool val) { is_rtl_ = val; }
bool get_rtl() const {return is_rtl_;}
void set_rtl(bool val) { is_rtl_ = val; }
bool get_rtl() const {return is_rtl_;}
double get_current_fontSize() {return current_fontSize.empty() ? 0 : current_fontSize.back();}
void pop_current_fontSize() {if (!current_fontSize.empty()) current_fontSize.pop_back();}
void set_margin_left(int val) {current_margin_left_ = val;}
int get_margin_left() {return current_margin_left_;}
void set_outline_level(int val) {current_outline_level_ = val;}
int get_outline_level() {return current_outline_level_;}
void set_process_note (NoteType Val) { process_note_ = Val; }
NoteType get_process_note () const { return process_note_; }
void set_process_note (NoteType Val) { current_process_note_ = Val; }
NoteType get_process_note () const { return current_process_note_; }
void add_note_reference ();
void start_paragraph_style(const std::wstring& style_name) {paragraph_style_stack_.push_back(style_name);}
void end_paragraph_style() { if (!paragraph_style_stack_.empty()) paragraph_style_stack_.pop_back();}
std::wstring get_current_paragraph_style() {return paragraph_style_stack_.empty() ? L"" : paragraph_style_stack_.back();}
oox_chart_context & current_chart();
void start_chart(std::wstring name);
void end_chart ();
void start_comment () {process_comment_ = true;}
void end_comment () {process_comment_ = false;}
bool process_comment_;
void start_comment () {current_process_comment_ = true;}
void end_comment () {current_process_comment_ = false;}
void start_math_formula ();
void end_math_formula ();
@ -950,7 +957,7 @@ public:
headers_footers & get_headers_footers() { return headers_footers_; }
header_footer_context & get_header_footer_context() { return header_footer_context_; }
drop_cap_context & get_drop_cap_context() {return drop_cap_context_;}
drop_cap_context & get_drop_cap_context() { return drop_cap_context_; }
styles_map styles_map_;
bool process_headers_footers_;
@ -961,6 +968,7 @@ public:
void end_changes();
void add_jsaProject(const std::string &content);
private:
struct _context_state
@ -1015,14 +1023,14 @@ private:
std::vector<oox_chart_context_ptr> charts_;
headers_footers headers_footers_;
std::wstring automatic_parent_style_;
std::wstring current_master_page_name_;
std::wstring text_list_style_name_;
std::vector<std::wstring> list_style_stack_;
std::vector<std::wstring> fields_names_stack_;
std::wstring automatic_parent_style_;
std::wstring current_master_page_name_;
std::wstring text_list_style_name_;
std::vector<std::wstring> paragraph_style_stack_;
std::vector<std::wstring> list_style_stack_;
std::vector<std::wstring> fields_names_stack_;
bool first_element_list_item_;
bool first_element_list_item_;
bool page_break_after_;
bool page_break_before_;
@ -1036,11 +1044,13 @@ private:
bool is_delete_text_;
bool is_rtl_; // right-to-left
std::wstring current_alphabetic_index_;
int current_margin_left_;
int current_outline_level_;
int new_list_style_number_; // счетчик для нумерации имен созданных в процессе конвертации стилей
NoteType process_note_;
NoteType current_process_note_;
bool current_process_comment_;
std::vector<double> current_fontSize;
std::wstring current_alphabetic_index_;
int current_margin_left_;
int current_outline_level_;
int new_list_style_number_; // счетчик для нумерации имен созданных в процессе конвертации стилей
std::vector<odf_reader::office_element*> delayed_elements_;

View File

@ -151,7 +151,6 @@ void serialize_wrap(std::wostream & strm, _docx_drawing const & val)
break;
case odf_types::style_wrap::Left:
case odf_types::style_wrap::Right:
case odf_types::style_wrap::Dynamic:
serialize_wrap_square(strm, val);
break;
case odf_types::style_wrap::RunThrough:
@ -160,6 +159,7 @@ void serialize_wrap(std::wostream & strm, _docx_drawing const & val)
case odf_types::style_wrap::None:
serialize_wrap_top_bottom(strm, val);
break;
case odf_types::style_wrap::Dynamic:
default:
CP_XML_NODE(L"wp:wrapTopAndBottom");
break;

View File

@ -73,7 +73,7 @@ std::pair<float, float> GetMaxDigitSizePixelsImpl(const std::wstring & fontName,
//if (FALSE == (hr = pFontManager->LoadString2( std::to_wstring(i), 0, 0)))
// return std::pair<float, float>(7,8);
if (FALSE == (hr = pFontManager->LoadString2( L"xxxxx" , 0, 0)))
if (FALSE == (hr = pFontManager->LoadString2( L"0123456789abcdefghijklmnopqrstuvwxyz" , 0, 0)))
return std::pair<float, float>(7,8);
TBBox box;
@ -96,7 +96,7 @@ std::pair<float, float> GetMaxDigitSizePixelsImpl(const std::wstring & fontName,
if (box.fMaxY - box.fMinY < minHeight) minHeight = box.fMaxY - box.fMinY;
}
double width = (minWidth + 2 * maxWidth) /3. /5.;
double width = (minWidth + 2 * maxWidth) /36. /3.;
return std::pair<float, float>(width, maxHeight);
}

View File

@ -194,7 +194,14 @@ std::wstring mediaitems::detectImageFileExtension(const std::wstring &fileName)
CImageFileFormatChecker image_checker;
sExt = image_checker.DetectFormatByData(buffer, buffer_size);
if (!sExt.empty()) sExt = std::wstring(L".") + sExt;
if (sExt.empty())
{
size_t n = fileName.rfind(L".");
if (n != std::wstring::npos)
sExt = XmlUtils::GetLower(fileName.substr(n));
}
else sExt = std::wstring(L".") + sExt;
}
return XmlUtils::GetLower(sExt);
}

View File

@ -150,12 +150,18 @@ void oox_axis_content::oox_serialize_content(std::wostream & _Wostream)
odf_reader::GetProperty(content_.properties_,L"maximum", doubleVal);
if (doubleVal)
{
CP_XML_ATTR(L"c:max", *doubleVal);
CP_XML_NODE(L"c:max")
{
CP_XML_ATTR(L"val", *doubleVal);
}
}
odf_reader::GetProperty(content_.properties_,L"minimum", doubleVal);
if (doubleVal)
{
CP_XML_ATTR(L"c:min", *doubleVal);
CP_XML_NODE(L"c:min")
{
CP_XML_ATTR(L"val", *doubleVal);
}
}
odf_reader::GetProperty(content_.properties_,L"logarithmic", boolVal);
if ((boolVal == true) && (boolVal.get()==true))

View File

@ -59,12 +59,19 @@ oox_chart_series::oox_chart_series()
bLocalTable_ = false;
labelPosEnabled_ = true;
}
void oox_chart_series::setName(std::wstring &value)
void oox_chart_series::setName(const std::wstring &value)
{
name_=value;
name_ = value;
}
void oox_chart_series::setLabels(const std::wstring &formula, std::vector<std::wstring> & cash)
{
formulasconvert::odf2oox_converter converter;
void oox_chart_series::setFormula(int ind, std::wstring &value, std::wstring & formatCode, bool link_to_source)
label_.present = true;
label_.formula = converter.convert_chart_distance(formula);
label_.str_cache = cash;
}
void oox_chart_series::setFormula(int ind, const std::wstring &value, const std::wstring & formatCode, bool link_to_source)
{
formulasconvert::odf2oox_converter converter;
@ -137,6 +144,7 @@ void oox_chart_series::parse_properties()
data_labels_->set_position(*intVal);
}
}
void oox_chart_series::setValues(int ind, std::vector<std::wstring> & values)
{
values_[ind].present = true;
@ -215,6 +223,44 @@ void oox_chart_series::oox_serialize_common(std::wostream & _Wostream)
shape.set(content_.graphic_properties_, content_.fill_);
shape.oox_serialize(_Wostream);
if (label_.present)
{
CP_XML_NODE(L"c:tx")
{
CP_XML_NODE(L"c:strRef")
{
if (!label_.formula.empty())
{
CP_XML_NODE(L"c:f")
{
CP_XML_STREAM() << label_.formula;
}
}
if (false == label_.str_cache.empty())
{
CP_XML_NODE(L"c:strCache")
{
CP_XML_NODE(L"c:ptCount")
{
CP_XML_ATTR(L"val", label_.str_cache.size());
}
for (size_t i = 0; i < label_.str_cache.size(); i++)
{
CP_XML_NODE(L"c:pt")
{
CP_XML_ATTR(L"idx", i);
CP_XML_NODE(L"c:v")
{
CP_XML_STREAM() << label_.str_cache[i];
}
}
}
}
}
}
}
}
for (int i = 0; i < 5; i++)
{
if (values_[i].present)

View File

@ -56,17 +56,20 @@ public:
virtual void oox_serialize(std::wostream & _Wostream) = 0;
bool labelPosEnabled_;
_oox_chart_values values_[5]; //cat(labels), common, x, y, bubble,
_oox_chart_values values_[5]; //cat, common, x, y, bubble,
_oox_strRef label_; //tx (Series Text) §21.2.2.215
int id_;
std::wstring name_; //tx (Series Text) §21.2.2.215
std::wstring name_;
int iSymbolMarkerType_;
bool bLocalTable_;
_CP_OPT(oox_data_labels) data_labels_;
void setName(std::wstring &value);
void setName(const std::wstring &value);
void setFormula (int ind, std::wstring & value, std::wstring & formatCode, bool link_to_source);
void setFormula (int ind, const std::wstring & value, const std::wstring & formatCode, bool link_to_source);
void setValues (int ind, std::vector<std::wstring> & values);
void setLabels (const std::wstring &formula, std::vector<std::wstring> & values);
void parse_properties();
void set_cache_only (bool val);

View File

@ -55,21 +55,21 @@ struct _oox_numLit
struct _oox_strRef
{
bool present;
bool present = false;
std::wstring formula;
int str_cache_count;
int str_cache_count = 0;
std::vector<std::wstring> str_cache;
};
struct _oox_numRef
{
bool present;
bool present = false;
std::wstring formula;
std::wstring formatCode;
bool link_to_source;
int num_cache_count;
bool link_to_source = false;
int num_cache_count = 0;
std::vector<std::wstring> num_cache;
};

View File

@ -131,7 +131,16 @@ static const std::wstring _ooxDashStyle[]=
L"dashDot",
L"sysDashDotDot"
};
static const std::wstring _vmlDashStyle[]=
{
L"none",
L"solid",
L"dot",
L"dash",
L"dash",
L"dashdot",
L"shortdashdotdot"
};
void oox_serialize_ln(std::wostream & strm, const std::vector<odf_reader::_property> & prop, bool always_draw, const std::wstring &ns)
{
std::wstring ns_att = (ns == L"a" ? L"" : ns + L":");
@ -152,7 +161,7 @@ void oox_serialize_ln(std::wostream & strm, const std::vector<odf_reader::_prope
odf_reader::GetProperty(prop, L"stroke" , iStroke);
odf_reader::GetProperty(prop, L"stroke-width" , dStrokeWidth);
odf_reader::GetProperty(prop, L"stroke-opacity" , dStrokeOpacity);
if ((!strStrokeColor && !iStroke && !dStrokeWidth) && !always_draw)return;
CP_XML_WRITER(strm)
@ -224,6 +233,69 @@ void oox_serialize_ln(std::wostream & strm, const std::vector<odf_reader::_prope
}
}
}
void vml_serialize_ln(std::wostream & strm, const std::vector<odf_reader::_property> & prop)
{
_CP_OPT(std::wstring) strStrokeColor;
_CP_OPT(int) iStroke;
_CP_OPT(double) dStrokeWidth;
_CP_OPT(double) dStrokeOpacity;
_CP_OPT(bool) bWordArt;
odf_reader::GetProperty(prop, L"wordArt", bWordArt);
odf_reader::GetProperty(prop, L"stroke-color" , strStrokeColor);
odf_reader::GetProperty(prop, L"stroke" , iStroke);
odf_reader::GetProperty(prop, L"stroke-width" , dStrokeWidth);
odf_reader::GetProperty(prop, L"stroke-opacity" , dStrokeOpacity);
if (!strStrokeColor && !iStroke && !dStrokeWidth) return;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"v:stroke")
{
std::wstring color, dash_style ;
if (strStrokeColor) color = *strStrokeColor;
if (iStroke)
{
if (iStroke.get() != 0 ) dash_style = _vmlDashStyle[iStroke.get()];
}
if ((dStrokeWidth) && (*dStrokeWidth >= 0))
{
int val = dStrokeWidth.get() * 12700; //in emu (1 pt = 12700)
if (val < 10) val = 12700;
CP_XML_ATTR(L"weight", val);
}
if (false == color.empty())
{
CP_XML_ATTR(L"color", L"#" + color);
}
if (!dash_style.empty() && dash_style != L"solid")
{
CP_XML_ATTR(L"dashstyle", dash_style);
}
//odf_reader::GetProperty(prop,L"marker-start", strVal);
//if (strVal)
//{
//}
//odf_reader::GetProperty(prop,L"marker-end",strVal);
//if (strVal)
//{
//}
CP_XML_ATTR(L"startarrow", L"block");
CP_XML_ATTR(L"startarrowwidth", L"medium");
CP_XML_ATTR(L"startarrowlength", L"medium");
CP_XML_ATTR(L"joinstyle", L"round");
CP_XML_ATTR(L"endcap", L"flat");
}
}
}
void oox_serialize_aLst(std::wostream & strm, const std::vector<odf_reader::_property> & prop, const std::wstring & shapeGeomPreset, const std::wstring &ns)
{
std::wstring ns_att = (ns == L"a" ? L"" : ns + L":");

View File

@ -124,6 +124,7 @@ namespace oox {
void oox_serialize_aLst (std::wostream & strm, const std::vector<odf_reader::_property> & val, const std::wstring & shapeGeomPreset, const std::wstring &ns = L"a");
void oox_serialize_action (std::wostream & strm, const _action_desc & val);
void vml_serialize_ln (std::wostream & strm, const std::vector<odf_reader::_property> & val);
}
}

View File

@ -245,7 +245,7 @@ void vml_serialize_gradient_fill(std::wostream & strm, const _oox_fill & val)
{
if (!val.gradient->colors.empty())
{
CP_XML_ATTR(L"color2", val.gradient->colors[val.gradient->colors.size() - 1].color_ref);
CP_XML_ATTR(L"color2", L"#" + val.gradient->colors[val.gradient->colors.size() - 1].color_ref);
std::wstring colors_value;
for (size_t i = 0; i < val.gradient->colors.size(); i++)
@ -404,6 +404,27 @@ void vml_serialize_background (std::wostream & strm, const _oox_fill & val, cons
}
}
void vml_serialize_fill (std::wostream & strm, const _oox_fill & val)
{
switch (val.type)
{
case 0:
break;
case 1:
vml_serialize_solid_fill(strm, val);
break;
case 2:
vml_serialize_bitmap_fill(strm, val);
break;
case 3:
vml_serialize_gradient_fill(strm, val);
break;
case 4:
//vml_serialize_hatch_fill(strm, val);
break;
}
}
void oox_serialize_fill (std::wostream & strm, const _oox_fill & val, const std::wstring &ns)
{
switch (val.type)

View File

@ -154,5 +154,6 @@ namespace oox {
void oox_serialize_bitmap_fill (std::wostream & strm, const _oox_fill & val, const std::wstring &ns = L"a");
void oox_serialize_fill (std::wostream & strm, const _oox_fill & val, const std::wstring &ns = L"a");
void vml_serialize_fill (std::wostream & strm, const _oox_fill & val);
}
}

View File

@ -46,13 +46,13 @@ void oox_chart::set_cache_only (bool val)
}
void oox_chart::set_formula_series(int ind, std::wstring val, std::wstring formatCode, bool link_to_source)
void oox_chart::set_formula_series(int ind, const std::wstring& val, const std::wstring& formatCode, bool link_to_source)
{
oox_series_ptr & current_ptr = series_.back();
current_ptr->setFormula(ind, val, formatCode, link_to_source);
}
void oox_chart::set_name(std::wstring val)
void oox_chart::set_name(const std::wstring& val)
{
oox_series_ptr & current_ptr = series_.back();
current_ptr->setName(val);
@ -68,6 +68,13 @@ void oox_chart::set_values_series(int ind, std::vector<std::wstring> & val)
oox_series_ptr & current_ptr = series_.back();
current_ptr->setValues (ind, val);
}
void oox_chart::set_label_series(const std::wstring& formula, std::vector<std::wstring> & cash)
{
if (formula.empty() && cash.empty()) return;
oox_series_ptr & current_ptr = series_.back();
current_ptr->setLabels (formula, cash);
}
void oox_chart::set_properties(std::vector<odf_reader::_property> g)
{
_CP_OPT(int) iVal;

View File

@ -78,9 +78,10 @@ public:
virtual void add_series(int id){}
void set_cache_only (bool val);
void set_formula_series (int ind, std::wstring val, std::wstring formatCode, bool link_to_source);
void set_formula_series (int ind, const std::wstring& val, const std::wstring& formatCode, bool link_to_source);
void set_values_series (int ind, std::vector<std::wstring> & val);
void set_name (std::wstring val);
void set_label_series (const std::wstring& formula, std::vector<std::wstring> & val);
void set_name (const std::wstring& val);
void set_content_series (odf_reader::chart::series & content);
//void set_showBubbleSize(bool Val){data_labels_.set_showBubbleSize(Val);}

View File

@ -51,7 +51,7 @@ public:
{
}
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content,pptx_comments_ptr comments)
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, pptx_comments_ptr comments)
{
const std::wstring file_id = std::to_wstring(next_file_id_++);

View File

@ -495,6 +495,10 @@ void pptx_slide_context::set_image(const std::wstring & path)
impl_->object_description_.type_ = typeImage;
impl_->object_description_.xlink_href_ = path;
}
else if (impl_->object_description_.type_ == typeImage && impl_->object_description_.xlink_href_.rfind(L".svg") != std::wstring::npos)
{
impl_->object_description_.xlink_href_ = path;
}
else if (impl_->use_image_replacement_)
{
impl_->object_description_.fill_.type = 2;

View File

@ -39,14 +39,14 @@
namespace cpdoccore {
namespace oox {
unsigned int hex_string_to_int(std::wstring str)
{
unsigned int x;
std::wstringstream ss;
ss << std::hex << str;
ss >> x;
return x;
}
unsigned int hex_string_to_int(std::wstring str)
{
unsigned int x;
std::wstringstream ss;
ss << std::hex << str;
ss >> x;
return x;
}
class xlsx_comments::Impl
{
@ -94,127 +94,6 @@ public:
}
}
}
void serialize_vml(std::wostream & strm) const
{
_CP_OPT(std::wstring) strVal;
_CP_OPT(double) dVal;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xml")
{
CP_XML_ATTR(L"xmlns:v", L"urn:schemas-microsoft-com:vml");
CP_XML_ATTR(L"xmlns:o", L"urn:schemas-microsoft-com:office:office");
CP_XML_ATTR(L"xmlns:x", L"urn:schemas-microsoft-com:office:excel");
for (size_t i = 0; i < xlsx_comment_.size(); i++)
{
const _xlsx_comment & c = xlsx_comment_[i];
std::wstring str_fill_color_ = L"00003f";
if (odf_reader::GetProperty(c.graphicProperties_,L"fill-color",strVal))
str_fill_color_ = strVal.get();
CP_XML_NODE(L"v:shapetype")
{
CP_XML_ATTR(L"id", L"shapetype_202");
CP_XML_ATTR(L"coordsize", L"21600,21600");
CP_XML_ATTR(L"o:spt", L"202");
CP_XML_ATTR(L"path", L"m,l,21600l21600,21600l21600,xe");
CP_XML_NODE(L"v:stroke")
{
CP_XML_ATTR(L"joinstyle", L"miter");
}
CP_XML_NODE(L"v:path")
{
CP_XML_ATTR(L"gradientshapeok", L"t");
CP_XML_ATTR(L"o:connecttype", L"rect");
}
}
CP_XML_NODE(L"v:shape")
{
if( hex_string_to_int(str_fill_color_) !=0 )
{
CP_XML_ATTR(L"fillcolor", std::wstring(L"#") + str_fill_color_);
}//иначе это полная прозрачность
CP_XML_ATTR(L"id", L"shape_0");
std::wstring style = std::wstring(L"position:absolute;");
style += std::wstring(L"margin-left:") + boost::lexical_cast<std::wstring>(c.left_) + std::wstring(L"pt;");
style += std::wstring(L"margin-top:") + boost::lexical_cast<std::wstring>(c.top_) + std::wstring(L"pt;");
style += std::wstring(L"width:") + boost::lexical_cast<std::wstring>(c.width_) + std::wstring(L"pt;");
style += std::wstring(L"height:") + boost::lexical_cast<std::wstring>(c.height_) + std::wstring(L"pt;");
if (c.visibly_ == false)style += std::wstring(L"visibility:hidden;");
CP_XML_ATTR(L"style",style);
CP_XML_ATTR(L"type", L"shapetype_202");
//if (odf_reader::GetProperty(c.graphicProperties_,L"opacity",dVal))
//{
// CP_XML_ATTR(L"opacity", boost::lexical_cast<std::wstring>((int)(100.-dVal.get())) + L"%");
//}
//CP_XML_NODE(L"v:shadow")
//{
// CP_XML_ATTR(L"color", L"black");
// CP_XML_ATTR(L"obscured", L"t");
// CP_XML_ATTR(L"on", L"t");
//}
CP_XML_NODE(L"v:wrap")
{
CP_XML_ATTR(L"v:type", L"none");
}
CP_XML_NODE(L"v:fill")
{
CP_XML_ATTR(L"detectmouseclick", L"t");
if( hex_string_to_int(str_fill_color_) !=0 )
{
CP_XML_ATTR(L"color", std::wstring(L"#") + str_fill_color_);
CP_XML_ATTR(L"color2", std::wstring(L"#") + str_fill_color_);
CP_XML_ATTR(L"type", L"solid");
}//иначе это полная прозрачность
//if (odf_reader::GetProperty(c.graphicProperties_,L"opacity",dVal))
//{
// CP_XML_ATTR(L"opacity", (dVal.get())/100.);
// //CP_XML_ATTR(L"opacity2",(dVal.get())/100.);
//}
}
CP_XML_NODE(L"v:stroke")
{
if (odf_reader::GetProperty(c.graphicProperties_,L"stroke-color",strVal))
CP_XML_ATTR(L"color", std::wstring(L"#") + strVal.get());
else
CP_XML_ATTR(L"color",L"#3465af"); //синенький
if (odf_reader::GetProperty(c.graphicProperties_,L"stroke-opacity",dVal))
{
CP_XML_ATTR(L"opacity",(100.-dVal.get())/100.);
}
CP_XML_ATTR(L"endcap", L"flat");
CP_XML_ATTR(L"joinstyle", L"round");
CP_XML_ATTR(L"startarrow", L"block");
CP_XML_ATTR(L"v:startarrowwidth", L"medium");
CP_XML_ATTR(L"startarrowlength", L"medium");
}
CP_XML_NODE(L"x:ClientData")
{
CP_XML_ATTR(L"ObjectType", L"Note");
CP_XML_NODE(L"x:MoveWithCells"){}
CP_XML_NODE(L"x:SizeWithCells"){}
CP_XML_NODE(L"x:AutoFill"){CP_XML_CONTENT("False");}
CP_XML_NODE(L"x:Row"){CP_XML_CONTENT(c.row_);}
CP_XML_NODE(L"x:Column"){CP_XML_CONTENT(c.col_);}
}
}
}
}
}
}
bool empty() const
{
return ( xlsx_comment_.empty());
@ -264,11 +143,6 @@ void xlsx_serialize(std::wostream & _Wostream, xlsx_comments const & val)
val.impl_->serialize(_Wostream);
}
void xlsx_serialize_vml(std::wostream & _Wostream, xlsx_comments const & val)
{
val.impl_->serialize_vml(_Wostream);
}
xlsx_comments_ptr xlsx_comments::create()
{
return boost::make_shared<xlsx_comments>();

View File

@ -42,38 +42,24 @@ namespace oox {
struct _xlsx_comment
{
size_t left_, top_;
size_t width_, height_;
std::wstring ref_;
int col_;
int row_;
bool visibly_;
std::vector<odf_reader::_property> graphicProperties_;
std::wstring author_;
std::wstring content_;
};
//class rels;
class xlsx_comments;
typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr;
struct comment_elm
{
comment_elm(std::wstring const & _filename, std::wstring const & _vml_filename, std::wstring const & _content, std::wstring const & _vml_content, xlsx_comments_ptr _comments)
: filename(_filename), content(_content), comments(_comments),vml_filename(_vml_filename),vml_content(_vml_content)
comment_elm(std::wstring const & _filename, std::wstring const & _content, xlsx_comments_ptr _comments)
: filename(_filename), content(_content), comments(_comments)
{}
xlsx_comments_ptr comments;
std::wstring filename;
std::wstring content;
std::wstring vml_filename;
std::wstring vml_content;
};
class xlsx_comments
@ -87,10 +73,7 @@ public:
void add(_xlsx_comment & d);
bool empty() const;
friend void docx_serialize(std::wostream & _Wostream, xlsx_comments const & val);
friend void xlsx_serialize(std::wostream & _Wostream, xlsx_comments const & val);
friend void xlsx_serialize_vml(std::wostream & _Wostream, xlsx_comments const & val);
private:
class Impl;

View File

@ -36,7 +36,6 @@
#include "../odf/datatypes/length.h"
#include "xlsx_utils.h"
//#include <formulasconvert.h>
namespace cpdoccore { namespace oox {
@ -46,32 +45,22 @@ typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr;
class xlsx_comments_context_handle::Impl
{
public:
Impl()
: next_comments_id_(1) ,next_file_id_(1)
Impl() : next_comments_id_(1), next_file_id_(1)
{
}
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, std::wstring const & vml_content,xlsx_comments_ptr comments)
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, xlsx_comments_ptr comments)
{
const std::wstring file_id = std::to_wstring(next_file_id_++);
const std::wstring file_id = std::to_wstring(next_file_id_++);
const std::wstring fileName = std::wstring(L"comments") + file_id + L".xml";
const std::wstring vml_fileName = std::wstring(L"vmlDrawing") + file_id + L".vml";
comments_.push_back(comment_elm(fileName,vml_fileName, content, vml_content, comments));
comments_.push_back(comment_elm(fileName, content, comments));
const std::wstring id = std::to_wstring(next_comments_id_++);
const std::wstring rId = std::wstring(L"comId") + id;
return std::pair<std::wstring, std::wstring>(fileName, rId);
}
std::pair<std::wstring, std::wstring> get_vml_drawing_xml()
{
const std::wstring id = std::to_wstring(next_comments_id_++);
const std::wstring rId = std::wstring(L"comId") + id;
return std::pair<std::wstring, std::wstring>(comments_.back().vml_filename, rId);
}
const std::vector<comment_elm> & content() const
{
return comments_;
@ -89,25 +78,17 @@ xlsx_comments_context_handle::xlsx_comments_context_handle()
: impl_(new xlsx_comments_context_handle::Impl())
{
}
xlsx_comments_context_handle::~xlsx_comments_context_handle()
{
}
std::pair<std::wstring, std::wstring> xlsx_comments_context_handle::add_comments_xml(std::wstring const & content, std::wstring const & vml_content,xlsx_comments_ptr comments)
std::pair<std::wstring, std::wstring> xlsx_comments_context_handle::add_comments_xml(std::wstring const & content, xlsx_comments_ptr comments)
{
return impl_->add_comments_xml(content,vml_content, comments);
return impl_->add_comments_xml(content, comments);
}
std::pair<std::wstring, std::wstring> xlsx_comments_context_handle::get_vml_drawing_xml()
{
return impl_->get_vml_drawing_xml();
}
const std::vector<comment_elm> & xlsx_comments_context_handle::content() const
{
return impl_->content();
}
class xlsx_comments_context::Impl
{
public:
@ -127,10 +108,6 @@ public:
{
xlsx_serialize(strm, *xlsx_comments_);
}
void serialize_vml(std::wostream & strm)
{
xlsx_serialize_vml(strm, *xlsx_comments_);
}
bool empty() const
{
return xlsx_comments_->empty();
@ -154,40 +131,20 @@ xlsx_comments_context::~xlsx_comments_context()
{
}
void xlsx_comments_context::start_comment (double width_pt, double height_pt, double x_pt, double y_pt)
void xlsx_comments_context::start_comment(const std::wstring & ref)
{
impl_->current_.ref_ = L"";
impl_->current_.width_ = width_pt;
impl_->current_.height_ = height_pt;
impl_->current_.left_ = x_pt;
impl_->current_.top_ = y_pt;
impl_->current_.visibly_ = false;
impl_->current_.ref_ = ref;
}
void xlsx_comments_context::add_content(std::wstring content)
void xlsx_comments_context::add_content(const std::wstring & content)
{
impl_->current_.content_ = content;
}
void xlsx_comments_context::add_author(std::wstring author)
void xlsx_comments_context::add_author(const std::wstring & author)
{
impl_->current_.author_ = author;
}
void xlsx_comments_context::set_visibly(bool Val)
void xlsx_comments_context::end_comment()
{
impl_->current_.visibly_ = Val;
}
std::vector<odf_reader::_property> & xlsx_comments_context::get_draw_properties()
{
return impl_->current_.graphicProperties_;
}
void xlsx_comments_context::end_comment(std::wstring ref,int col, int row)
{
impl_->current_.ref_ = ref;
impl_->current_.col_ = col;
impl_->current_.row_ = row;
impl_->add_comment(impl_->current_);
}
@ -200,11 +157,6 @@ void xlsx_comments_context::serialize(std::wostream & strm)
{
impl_->serialize(strm);
}
void xlsx_comments_context::serialize_vml(std::wostream & strm)
{
impl_->serialize_vml(strm);
}
xlsx_comments_ptr xlsx_comments_context::get_comments()
{
return impl_->get_comments();

View File

@ -45,16 +45,13 @@ class xlsx_table_metrics;
class xlsx_comments;
typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr;
class xlsx_comments_context_handle
{
public:
xlsx_comments_context_handle();
~xlsx_comments_context_handle();
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, std::wstring const & vml_content,xlsx_comments_ptr comments);
std::pair<std::wstring, std::wstring> get_vml_drawing_xml();
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, xlsx_comments_ptr comments);
const std::vector<comment_elm> & content() const;
friend class xlsx_comments_context;
@ -72,21 +69,16 @@ public:
xlsx_comments_context(xlsx_comments_context_handle & h);
~xlsx_comments_context();
void start_comment(double width_pt, double height_pt, double x_pt, double y_pt);
void start_comment(const std::wstring & ref);
void add_content(std::wstring content);
void add_author(std::wstring author);
void add_content(const std::wstring & content);
void add_author(const std::wstring & author);
std::vector<odf_reader::_property> & get_draw_properties();
void set_visibly(bool Val);
void end_comment(std::wstring ref,int col,int row);
void end_comment();
bool empty() const;
void serialize (std::wostream & strm);
void serialize_vml (std::wostream & strm);
void serialize (std::wostream & strm);
xlsx_comments_ptr get_comments();
private:

View File

@ -35,6 +35,30 @@
#include <xml/utils.h>
#include "../odf/datatypes/custom_shape_types_convert.h"
#include "../../formulasconvert/formulasconvert.h"
#define OBJ_Group 0x0000
#define OBJ_Line 0x0001
#define OBJ_Rectangle 0x0002
#define OBJ_Oval 0x0003
#define OBJ_Arc 0x0004
#define OBJ_Text 0x0006
#define OBJ_OfficeArt 0x001E
#define OBJ_Polygon 0x0009
#define OBJ_Picture 0x0008
#define OBJ_Chart 0x0005
#define OBJ_Button 0x0007
#define OBJ_CheckBox 0x000B
#define OBJ_RadioButton 0x000C
#define OBJ_EditBox 0x000D
#define OBJ_Label 0x000E
#define OBJ_DialogBox 0x000F
#define OBJ_SpinControl 0x0010
#define OBJ_Scrollbar 0x0011
#define OBJ_List 0x0012
#define OBJ_GroupBox 0x0013
#define OBJ_DropdownList 0x0014
#define OBJ_Note 0x0019
namespace cpdoccore {
namespace oox {
@ -48,7 +72,7 @@ std::wostream & operator << (std::wostream & strm, xlsx_drawing_position::type_t
}
}
void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
void xml_serialize_text(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
_CP_OPT(std::wstring) strTextContent;
odf_reader::GetProperty ( val.additional, L"text-content", strTextContent);
@ -71,28 +95,34 @@ void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val, const std::w
}
}
void xlsx_drawing_position::serialize(std::wostream & strm, const std::wstring & ns)
std::wstring xlsx_drawing_position::vml_serialize()
{
//emu -> pt = 1 / 12700 = 72.0 / (360000.0 * 2.54);
return std::to_wstring(position.col) + L"," + std::to_wstring((int)(position.colOff / 12700)) + L"," +
std::to_wstring(position.row) + L"," + std::to_wstring((int)(position.rowOff / 12700));
}
void xlsx_drawing_position::serialize(std::wostream & strm, const std::wstring & ns_title, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE( ns + (ns.empty() ? L"" : L":") + (type == xlsx_drawing_position::from ? L"from" : L"to") )
CP_XML_NODE( ns_title + (ns_title.empty() ? L"" : L":") + (type == xlsx_drawing_position::from ? L"from" : L"to") )
{
CP_XML_NODE(ns + L":col")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"col")
{
CP_XML_CONTENT(position.col);
}
CP_XML_NODE(ns + L":colOff")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"colOff")
{
CP_XML_CONTENT(static_cast<size_t>(position.colOff));
}
CP_XML_NODE(ns + L":row")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"row")
{
CP_XML_CONTENT(position.row);
}
CP_XML_NODE(ns + L":rowOff")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"rowOff")
{
CP_XML_CONTENT(static_cast<size_t>(position.rowOff));
}
@ -100,7 +130,7 @@ void xlsx_drawing_position::serialize(std::wostream & strm, const std::wstring &
}
}
void xlsx_serialize_image(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
void xml_serialize_image(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
@ -139,12 +169,12 @@ void xlsx_serialize_image(std::wostream & strm, _xlsx_drawing & val, const std::
}
oox_serialize_ln(CP_XML_STREAM(), val.additional);
}
xlsx_serialize_text(CP_XML_STREAM(), val, ns);
xml_serialize_text(CP_XML_STREAM(), val, ns);
}
} // CP_XML_WRITER
}
void xlsx_serialize_shape(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
void xml_serialize_shape(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
@ -174,11 +204,11 @@ void xlsx_serialize_shape(std::wostream & strm, _xlsx_drawing & val, const std::
oox_serialize_ln(CP_XML_STREAM(),val.additional, val.lined);
} // xdr:spPr
xlsx_serialize_text(CP_XML_STREAM(), val, ns);
xml_serialize_text(CP_XML_STREAM(), val, ns);
}
} // CP_XML_WRITER
}
void xlsx_serialize_object(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_object(std::wostream & strm, _xlsx_drawing & val)
{//отображательная часть
CP_XML_WRITER(strm)
{
@ -206,7 +236,7 @@ void xlsx_serialize_object(std::wostream & strm, _xlsx_drawing & val)
}
}
}
void xlsx_serialize_group(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
void xml_serialize_group(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
@ -231,7 +261,7 @@ void xlsx_serialize_group(std::wostream & strm, _xlsx_drawing & val, const std::
}
}
void xlsx_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
{//отображательная часть
CP_XML_WRITER(strm)
{
@ -266,36 +296,37 @@ void xlsx_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
}
}
}
void xlsx_serialize(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
void xml_serialize(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
if (val.type == typeShape)
{
xlsx_serialize_shape(strm, val, ns);
xml_serialize_shape(strm, val, ns);
}
else if (val.type == typeImage)
{
xlsx_serialize_image(strm, val, ns);
xml_serialize_image(strm, val, ns);
}
else if (val.type == typeChart)
{
xlsx_serialize_chart(strm, val);
xml_serialize_chart(strm, val);
}
else if (val.type == typeGroupShape)
{
xlsx_serialize_group(strm, val, ns);
xml_serialize_group(strm, val, ns);
}
else if (val.type == typeOleObject ||
val.type == typeMsObject ||
val.type == typeControl)
{
xlsx_serialize_object(strm, val);
xml_serialize_object(strm, val);
}
}
void _xlsx_drawing::serialize(std::wostream & strm, const std::wstring & ns)
{
if (inGroup)
return xlsx_serialize(strm, *this, ns);
return xml_serialize(strm, *this, ns);
CP_XML_WRITER(strm)
{
@ -308,7 +339,7 @@ void _xlsx_drawing::serialize(std::wostream & strm, const std::wstring & ns)
from_.serialize (CP_XML_STREAM());
to_.serialize (CP_XML_STREAM());
xlsx_serialize (CP_XML_STREAM(), *this, ns);
xml_serialize (CP_XML_STREAM(), *this, ns);
CP_XML_NODE(ns + L":clientData");
}
}
@ -326,7 +357,7 @@ void _xlsx_drawing::serialize(std::wostream & strm, const std::wstring & ns)
CP_XML_ATTR(L"cx", cx);
CP_XML_ATTR(L"cy", cy);
}
xlsx_serialize(CP_XML_STREAM(), *this, ns);
xml_serialize(CP_XML_STREAM(), *this, ns);
CP_XML_NODE(ns + L":clientData");
}
}
@ -359,14 +390,12 @@ void _xlsx_drawing::serialize(std::wostream & strm, const std::wstring & ns)
CP_XML_STREAM() << ((double)y1 / *owner_cy_);
}
}
xlsx_serialize(CP_XML_STREAM(), *this, ns);
xml_serialize(CP_XML_STREAM(), *this, ns);
}
}
}
}
void _xlsx_drawing::serialize_object (std::wostream & strm)
{
if (type != typeOleObject && type != typeMsObject) return;
@ -390,9 +419,8 @@ void _xlsx_drawing::serialize_object (std::wostream & strm)
{
CP_XML_ATTR(L"moveWithCells", 1);
from_.serialize (CP_XML_STREAM(), L"");
to_.serialize (CP_XML_STREAM(), L"");
from_.serialize (CP_XML_STREAM(), L"", L"");
to_.serialize (CP_XML_STREAM(), L"", L"");
}
}
}
@ -422,8 +450,8 @@ void _xlsx_drawing::serialize_control (std::wostream & strm)
{
CP_XML_ATTR(L"moveWithCells", 1);
from_.serialize (CP_XML_STREAM(), L"");
to_.serialize (CP_XML_STREAM(), L"");
from_.serialize (CP_XML_STREAM(), L"", L"xdr");
to_.serialize (CP_XML_STREAM(), L"", L"xdr");
}
}
@ -431,6 +459,164 @@ void _xlsx_drawing::serialize_control (std::wostream & strm)
}
}
void _xlsx_drawing::serialize_vml(std::wostream & strm)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"v:shape")
{
CP_XML_ATTR(L"id", L"_x0000_s" + std::to_wstring(id));
CP_XML_ATTR(L"type", sub_type == 9 ? L"#_x0000_t202" : L"#_x0000_t201");
std::wstring color;
if (fill.solid)
color = fill.solid->color;
if (!color.empty())
CP_XML_ATTR(L"fillcolor", L"#" + color);
CP_XML_ATTR(L"stroked", /*lined ? */L"t"/* : L"f"*/);
std::wstring style = L"position:absolute";
//style +="margin-left:414.3pt;margin-top:70.2pt;width:144.15pt;height:96.75pt";
CP_XML_ATTR(L"style", style);
CP_XML_NODE(L"v:shadow")
{
CP_XML_ATTR(L"on", L"t");
CP_XML_ATTR(L"obscured", L"t");
CP_XML_ATTR(L"color", L"black");
}
CP_XML_NODE(L"w10:wrap")
{
CP_XML_ATTR(L"type", L"none");
}
vml_serialize_fill(CP_XML_STREAM(), fill);
vml_serialize_ln(CP_XML_STREAM(), additional);
CP_XML_NODE(L"x:ClientData")
{
switch(sub_type)
{
case OBJ_Button: CP_XML_ATTR(L"ObjectType", L"Button"); break;
case OBJ_CheckBox: CP_XML_ATTR(L"ObjectType", L"Checkbox");break;
case OBJ_RadioButton: CP_XML_ATTR(L"ObjectType", L"Radio"); break;
case OBJ_EditBox: CP_XML_ATTR(L"ObjectType", L"Edit"); break;
case OBJ_Label: CP_XML_ATTR(L"ObjectType", L"Label"); break;
case OBJ_DialogBox: CP_XML_ATTR(L"ObjectType", L"Dialog"); break;
case OBJ_SpinControl: CP_XML_ATTR(L"ObjectType", L"Spin"); break;
case OBJ_Scrollbar: CP_XML_ATTR(L"ObjectType", L"Scroll"); break;
case OBJ_List: CP_XML_ATTR(L"ObjectType", L"List"); break;
case OBJ_DropdownList: CP_XML_ATTR(L"ObjectType", L"List"); break;
case OBJ_Note: CP_XML_ATTR(L"ObjectType", L"Note"); break;
}
CP_XML_NODE(L"x:MoveWithCells");
CP_XML_NODE(L"x:SizeWithCells");
CP_XML_NODE(L"x:Anchor")
{
CP_XML_STREAM() << from_.vml_serialize() << L"," << to_.vml_serialize();
}
CP_XML_NODE(L"x:AutoFill")
{
CP_XML_STREAM() << L"False";
}
_CP_OPT(int) base_col, base_row;
GetProperty(additional, L"base_col", base_col);
GetProperty(additional, L"base_row", base_row);
if (base_row)
{
CP_XML_NODE(L"x:Row")
{
CP_XML_STREAM() << *base_row;
}
}
if (base_col)
{
CP_XML_NODE(L"x:Column")
{
CP_XML_STREAM() << *base_col;
}
}
_CP_OPT(std::wstring) sVal;
GetProperty(additional, L"linked_cell", sVal);
if (sVal)
{
formulasconvert::odf2oox_converter converter;
std::wstring fmla = converter.convert_named_ref(*sVal);
CP_XML_NODE(L"x:FmlaLink")
{
CP_XML_STREAM() << fmla;
}
}
_CP_OPT(bool) visible;
GetProperty(additional, L"visible", visible);
if ((visible) && (*visible == false))
{
CP_XML_NODE(L"x:Visible")
{
CP_XML_STREAM() << L"False";
}
}
else
CP_XML_NODE(L"x:Visible");
_CP_OPT(int) nVal;
GetProperty(additional, L"min_value", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Min")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"max_value", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Max")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"step", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Inc")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"page_step", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Page")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"value", sVal);
if (sVal)
{
CP_XML_NODE(L"x:Val")
{
CP_XML_STREAM() << *sVal;
}
}
GetProperty(additional, L"orientation", sVal);
if (sVal)
{
if (*sVal == L"horizontal") CP_XML_NODE(L"x:Horiz");
else CP_XML_NODE(L"x:Vert");
}
}
}
}
}
}
}

View File

@ -49,10 +49,10 @@ struct xlsx_drawing_position
enum type_t {from, to} type;
xlsx_table_position position;
void serialize(std::wostream & _Wostream, const std::wstring & ns = L"xdr");
void serialize(std::wostream & _Wostream, const std::wstring & ns_title = L"xdr", const std::wstring & ns = L"xdr");
std::wstring vml_serialize();
};
class _xlsx_drawing : public _oox_drawing
{
public:
@ -71,6 +71,7 @@ public:
virtual void serialize (std::wostream & strm) {return serialize(strm, L"xdr");}
void serialize (std::wostream & strm, const std::wstring & ns);
void serialize_vml (std::wostream & strm);
void serialize_object (std::wostream & strm);
void serialize_control (std::wostream & strm);
};

View File

@ -53,15 +53,21 @@ namespace oox {
class xlsx_drawing_context_handle::Impl
{
public:
Impl(mediaitems_ptr & items) : items_(items), next_rId_(1), next_drawing_id_(1)
Impl(mediaitems_ptr & items) : items_(items), next_drawing_id_(1), next_vml_drawing_id_(1)
{
}
mediaitems_ptr & get_mediaitems() { return items_; }
size_t next_rId()
std::pair<std::wstring, std::wstring> add_drawing_vml(std::wstring const & content, xlsx_drawings_ptr drawings)
{
return next_rId_++;
const std::wstring id = std::to_wstring(next_vml_drawing_id_++);
const std::wstring fileName = std::wstring(L"vmlDrawing") + id + L".vml";
drawings_vml_.push_back(drawing_elm(fileName, content, drawings, typeDefault));
const std::wstring rId = std::wstring(L"rVId") + id;
return std::pair<std::wstring, std::wstring>(fileName, rId);
}
std::pair<std::wstring, std::wstring> add_drawing_xml(std::wstring const & content, xlsx_drawings_ptr drawings, RelsType const & type_)
@ -75,20 +81,26 @@ public:
return std::pair<std::wstring, std::wstring>(fileName, rId);
}
const std::vector<drawing_elm> & content() const
{
return drawings_;
}
const std::vector<drawing_elm> & content() const
{
return drawings_;
}
const std::vector<drawing_elm> & content_vml() const
{
return drawings_vml_;
}
private:
mediaitems_ptr items_;
std::vector<drawing_elm> drawings_;
std::vector<drawing_elm> drawings_;
std::vector<drawing_elm> drawings_vml_;
size_t next_rId_;
size_t next_drawing_id_;
size_t next_vml_drawing_id_;
};
xlsx_drawing_context_handle::xlsx_drawing_context_handle(mediaitems_ptr & items) :
impl_(new xlsx_drawing_context_handle::Impl(items))
next_rId_(1), impl_(new xlsx_drawing_context_handle::Impl(items))
{
}
@ -100,12 +112,19 @@ std::pair<std::wstring, std::wstring> xlsx_drawing_context_handle::add_drawing_x
{
return impl_->add_drawing_xml(content, drawings, type_);
}
std::pair<std::wstring, std::wstring> xlsx_drawing_context_handle::add_drawing_vml(std::wstring const & content, xlsx_drawings_ptr drawings)
{
return impl_->add_drawing_vml(content, drawings);
}
const std::vector<drawing_elm> & xlsx_drawing_context_handle::content() const
{
return impl_->content();
}
const std::vector<drawing_elm> & xlsx_drawing_context_handle::content_vml() const
{
return impl_->content_vml();
}
class xlsx_drawing_context::Impl
{
public:
@ -131,15 +150,21 @@ public:
{
xlsx_drawings_->serialize(strm, ns);
}
void serialize_vml(std::wostream & strm)
{
xlsx_drawings_->serialize_vml(strm);
}
bool empty() const
{
return xlsx_drawings_->empty();
}
bool vml_empty() const
{
return xlsx_drawings_->vml_empty();
}
size_t next_rId()
{
return handle_->impl_->next_rId();
return handle_->next_rId();
}
xlsx_drawings_ptr get_drawings()
@ -282,7 +307,29 @@ void xlsx_drawing_context::end_shape()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::start_comment(int base_col, int base_row)
{
impl_->object_description_.type_ = typeComment;
impl_->object_description_.shape_type_ = 19; // OBJ_Note object type for vml
set_property(odf_reader::_property(L"base_col", base_col));
set_property(odf_reader::_property(L"base_row", base_row));
}
void xlsx_drawing_context::end_comment()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::start_control(const std::wstring & ctrlPropId, int type)
{
impl_->object_description_.type_ = typeControl;
impl_->object_description_.shape_type_ = type; // object type for vml
impl_->object_description_.xlink_href_ = ctrlPropId;
}
void xlsx_drawing_context::end_control()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::set_use_image_replacement()
{
impl_->use_image_replacement_ = true;
@ -305,11 +352,6 @@ void xlsx_drawing_context::set_ms_object(const std::wstring & path, const std::w
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void xlsx_drawing_context::set_control(const std::wstring & ctrlPropId)
{
impl_->object_description_.type_ = typeControl;
impl_->object_description_.xlink_href_ = ctrlPropId;
}
void xlsx_drawing_context::set_image(const std::wstring & path)
{
int pos_replaicement = path.find(L"ObjectReplacements");
@ -446,7 +488,10 @@ bool xlsx_drawing_context::empty() const
{
return impl_->empty();
}
bool xlsx_drawing_context::vml_empty() const
{
return impl_->vml_empty();
}
void xlsx_drawing_context::process_common_properties(drawing_object_description & obj, _xlsx_drawing & drawing, xlsx_table_metrics & table_metrics)
{
if (obj.anchor_.empty())
@ -585,7 +630,7 @@ void xlsx_drawing_context::process_image(drawing_object_description & obj, _xlsx
if (drawing.type == typeShape)
{
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);//собственно это не объект, а доп рел и ref объекта
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage, false, false);//собственно это не объект, а доп рел и ref объекта
isMediaInternal=true;
std::wstring rId = impl_->get_mediaitems()->add_or_find(L"", typeShape, isMediaInternal, ref);
@ -597,7 +642,7 @@ void xlsx_drawing_context::process_image(drawing_object_description & obj, _xlsx
xlsx_drawings_->add(drawing, isMediaInternal, drawing.fill.bitmap->rId , ref, typeImage);//объект
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, obj.type_); // не объект
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, obj.type_, false, false); // не объект
}
}
@ -610,8 +655,9 @@ void xlsx_drawing_context::process_chart(drawing_object_description & obj,_xlsx_
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_);
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_); // не объект
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_, false, false); // не объект
}
void xlsx_drawing_context::process_object(drawing_object_description & obj, xlsx_table_metrics & table_metrics, _xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_)
{
std::wstring ref;
@ -637,10 +683,11 @@ void xlsx_drawing_context::process_object(drawing_object_description & obj, xlsx
drawing.to_.position.rowOff = static_cast<size_t>(odf_types::length(to.rowOff, odf_types::length::pt).get_value_unit(odf_types::length::emu));
}
if (obj.type_ == typeControl)
if (obj.type_ == typeControl || obj.type_ == typeComment)
{
drawing.objectId = obj.xlink_href_;
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_);
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_, false);
}
else
{
@ -651,14 +698,14 @@ void xlsx_drawing_context::process_object(drawing_object_description & obj, xlsx
}
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_); // не объект
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_, false, false); // не объект
}
void xlsx_drawing_context::process_shape(drawing_object_description & obj,_xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_)
{
std::wstring ref;
bool isMediaInternal = true;
std::wstring rId = impl_->get_mediaitems()->add_or_find(L"", obj.type_, isMediaInternal, ref);
std::wstring rId = impl_->get_mediaitems()->add_or_find(L"", obj.type_, isMediaInternal, ref);
xlsx_drawings_->add(drawing, isMediaInternal, rId, ref, obj.type_);
}
@ -702,7 +749,7 @@ void xlsx_drawing_context::process_group_objects(std::vector<drawing_object_desc
drawing.lined = obj.lined_;
drawing.connector = obj.connector_;
drawing.sub_type = obj.shape_type_;
drawing.sub_type = obj.shape_type_;
if (drawing.fill.bitmap)
{
@ -712,7 +759,7 @@ void xlsx_drawing_context::process_group_objects(std::vector<drawing_object_desc
drawing.fill.bitmap->rId = impl_->get_mediaitems()->add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
bool in_sheet = (obj.type_== typeOleObject || obj.type_== typeMsObject) ? true : false;
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage, in_sheet);//собственно это не объект, а доп рел и ref объекта
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage, in_sheet, false);//собственно это не объект, а доп рел и ref объекта
//object dumps in sheet rels !!
}
@ -727,8 +774,8 @@ void xlsx_drawing_context::process_group_objects(std::vector<drawing_object_desc
case typeGroupShape: process_group ( obj, table_metrics, drawing, xlsx_drawings_); break;
case typeMsObject:
case typeOleObject:
case typeControl:
process_object ( obj, table_metrics, drawing, xlsx_drawings_); break;
case typeControl:
case typeComment: process_object ( obj, table_metrics, drawing, xlsx_drawings_); break;
}
}
}
@ -737,6 +784,10 @@ void xlsx_drawing_context::serialize(std::wostream & strm, const std::wstring& n
{
impl_->serialize(strm, ns);
}
void xlsx_drawing_context::serialize_vml(std::wostream & strm)
{
impl_->serialize_vml(strm);
}
xlsx_drawings_ptr xlsx_drawing_context::get_drawings()
{

View File

@ -63,10 +63,20 @@ public:
~xlsx_drawing_context_handle();
std::pair<std::wstring, std::wstring> add_drawing_xml(std::wstring const & content, xlsx_drawings_ptr drawings, RelsType const & type_ = typeDefault);
const std::vector<drawing_elm> & content() const;
std::pair<std::wstring, std::wstring> add_drawing_vml(std::wstring const & content, xlsx_drawings_ptr drawings);
const std::vector<drawing_elm> & content() const;
const std::vector<drawing_elm> & content_vml() const;
friend class xlsx_drawing_context;
size_t next_rId()
{
return next_rId_++;
}
private:
size_t next_rId_;
class Impl;
_CP_PTR(Impl) impl_;
};
@ -90,7 +100,6 @@ public:
void end_group ();
void start_shape(int type);
//...пока тока общие свойства ... частные для каждого объекта пооозже
void end_shape();
void start_frame();
@ -98,10 +107,15 @@ public:
void set_chart (const std::wstring & path);
void set_ole_object (const std::wstring & path, const std::wstring & progId);
void set_ms_object (const std::wstring & path, const std::wstring & progId);
void set_control (const std::wstring & ctrlPropId);
void set_text_box ();
void end_frame();
void start_control(const std::wstring & ctrlPropId, int type);
void end_control();
void start_comment(int base_col, int base_row);
void end_comment();
void set_rect(double width_pt, double height_pt, double x_pt, double y_pt);
void set_translate (double x_pt, double y_pt);
@ -110,13 +124,13 @@ public:
void set_rel_anchor (_INT32 owner_cx, _INT32 owner_cy);
void set_anchor (std::wstring anchor, double x_pt, double y_pt, bool group = false);
void set_property (odf_reader::_property p);
void set_clipping (const std::wstring & str );
void set_fill (_oox_fill & fill);
void set_is_line_shape(bool val);
void set_is_connector_shape(bool val);
void set_property (odf_reader::_property p);
std::vector<odf_reader::_property> & get_properties();
std::wstring add_hyperlink(std::wstring const & ref);
@ -124,9 +138,12 @@ public:
void set_use_image_replacement();
bool empty() const;
bool vml_empty() const;
void clear();
void serialize(std::wostream & strm, const std::wstring& ns = L"xdr");
void serialize_vml(std::wostream & strm);
std::wstring dump_path(std::vector<svg_path::_polyline> & path, double w,double h);

View File

@ -46,18 +46,25 @@ class xlsx_drawings::Impl
public:
void add(_xlsx_drawing const & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel )//объект
{
xlsx_drawings_.push_back(d);
add (isInternal, rid, ref, type, sheet_rel);
for (size_t i = 0; i < d.hlinks.size(); i++)
{
xlsx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink));
if (type == typeControl || type == typeControlProps || type == typeComment)
{
vml_drawings_.push_back(d);
add (isInternal, rid, ref, type, sheet_rel, true);
}
else
{
drawings_.push_back(d);
add (isInternal, rid, ref, type, sheet_rel, false);
for (size_t i = 0; i < d.hlinks.size(); i++)
{
drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink));
}
if (!d.action.hId.empty())
drawing_rels_.push_back(_rel(false, d.action.hId, d.action.hRef, d.action.typeRels));
}
if (!d.action.hId.empty())
xlsx_drawing_rels_.push_back(_rel(false, d.action.hId, d.action.hRef, d.action.typeRels));
}
void add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel) //не объект
void add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel, bool vml_rel) //не объект
{
bool present = false;
@ -73,25 +80,37 @@ public:
if (!present)
xlsx_sheet_rels_.push_back (_rel(isInternal, rid, ref, type));
}
else
else if (vml_rel)
{
for (size_t i = 0 ; i < xlsx_drawing_rels_.size(); i++)
for (size_t i = 0 ; i < vml_drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].rid == rid && xlsx_drawing_rels_[i].ref == ref)
if (vml_drawing_rels_[i].rid == rid && vml_drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
xlsx_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
vml_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
else
{
for (size_t i = 0 ; i < drawing_rels_.size(); i++)
{
if (drawing_rels_[i].rid == rid && drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
}
void serialize(std::wostream & strm, const std::wstring & ns)
{
if (drawings_.empty()) return;
if (inGroup)
{
for (size_t i = 0 ; i < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < drawings_.size(); i++)
{
xlsx_drawings_[i].serialize(strm, ns);
drawings_[i].serialize(strm, ns);
}
}
else
@ -111,9 +130,74 @@ public:
CP_XML_ATTR(L"xmlns:a" , L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_ATTR(L"xmlns:r" , L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
for (size_t i = 0 ; i < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < drawings_.size(); i++)
{
xlsx_drawings_[i].serialize(CP_XML_STREAM(), ns);
drawings_[i].serialize(CP_XML_STREAM(), ns);
}
}
}
}
}
void serialize_vml(std::wostream & strm)
{
if (vml_drawings_.empty()) return;
if (inGroup)
{
for (size_t i = 0 ; i < vml_drawings_.size(); i++)
{
vml_drawings_[i].serialize_vml(strm);
}
}
else
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xml")
{
CP_XML_ATTR(L"xmlns:v", L"urn:schemas-microsoft-com:vml");
CP_XML_ATTR(L"xmlns:o", L"urn:schemas-microsoft-com:office:office");
CP_XML_ATTR(L"xmlns:x", L"urn:schemas-microsoft-com:office:excel");
CP_XML_NODE(L"v:shapetype")
{
CP_XML_ATTR(L"id", L"_x0000_t201");
CP_XML_ATTR(L"o:spt", L"201"); // sptHostControl = 201
CP_XML_ATTR(L"coordsize", L"21600,21600");
CP_XML_ATTR(L"path", L"m,l,21600r21600,l21600,xe");
CP_XML_NODE(L"v:stroke")
{
CP_XML_ATTR(L"joinstyle", L"miter");
}
CP_XML_NODE(L"v:path")
{
CP_XML_ATTR(L"gradientshapeok", L"t");
CP_XML_ATTR(L"o:connecttype", L"rect");
}
}
CP_XML_NODE(L"v:shapetype")
{
CP_XML_ATTR(L"id", L"_x0000_t202");
CP_XML_ATTR(L"o:spt", L"202"); // sptTextBox = 202
CP_XML_ATTR(L"coordsize", L"21600,21600");
CP_XML_ATTR(L"path", L"m,l,21600l21600,21600l21600,xe");
CP_XML_NODE(L"v:stroke")
{
CP_XML_ATTR(L"joinstyle", L"miter");
}
CP_XML_NODE(L"v:path")
{
CP_XML_ATTR(L"gradientshapeok", L"t");
CP_XML_ATTR(L"o:connecttype", L"rect");
}
}
for (size_t i = 0 ; i < vml_drawings_.size(); i++)
{
vml_drawings_[i].serialize_vml(CP_XML_STREAM());
}
}
}
@ -121,41 +205,62 @@ public:
}
void serialize_objects(std::wostream & strm)
{
for (size_t i = 0 ; i < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < drawings_.size(); i++)
{
if (xlsx_drawings_[i].type != typeOleObject && xlsx_drawings_[i].type != typeMsObject) continue;
if (drawings_[i].type != typeOleObject && drawings_[i].type != typeMsObject) continue;
xlsx_drawings_[i].serialize_object(strm);
drawings_[i].serialize_object(strm);
}
}
void serialize_controls(std::wostream & strm)
{
for (size_t i = 0 ; i < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < vml_drawings_.size(); i++)
{
if (xlsx_drawings_[i].type != typeControl) continue;
if (vml_drawings_[i].type != typeControl) continue;
xlsx_drawings_[i].serialize_control(strm);
vml_drawings_[i].serialize_control(strm);
}
}
bool empty() const
{
return (xlsx_drawings_.empty());
return (drawings_.empty());
}
bool vml_empty() const
{
return (vml_drawings_.empty());
}
void dump_rels_drawing(rels & Rels)
{
for (size_t i = 0 ; i < xlsx_drawing_rels_.size(); i++)
for (size_t i = 0 ; i < drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].type == typeImage ||
xlsx_drawing_rels_[i].type == typeMedia ||
xlsx_drawing_rels_[i].type == typeChart ||
xlsx_drawing_rels_[i].type == typeHyperlink )
if (drawing_rels_[i].type == typeImage ||
drawing_rels_[i].type == typeMedia ||
drawing_rels_[i].type == typeChart ||
drawing_rels_[i].type == typeHyperlink )
{
Rels.add(relationship( xlsx_drawing_rels_[i].rid,
mediaitems::get_rel_type(xlsx_drawing_rels_[i].type),
(xlsx_drawing_rels_[i].is_internal ? std::wstring(L"../") + xlsx_drawing_rels_[i].ref : xlsx_drawing_rels_[i].ref),
(xlsx_drawing_rels_[i].is_internal ? L"" : L"External")) );
Rels.add(relationship( drawing_rels_[i].rid,
mediaitems::get_rel_type(drawing_rels_[i].type),
(drawing_rels_[i].is_internal ? std::wstring(L"../") + drawing_rels_[i].ref : drawing_rels_[i].ref),
(drawing_rels_[i].is_internal ? L"" : L"External")) );
}
}
}
void dump_rels_vml_drawing(rels & Rels)
{
for (size_t i = 0 ; i < vml_drawing_rels_.size(); i++)
{
if (vml_drawing_rels_[i].type == typeImage ||
vml_drawing_rels_[i].type == typeMedia ||
vml_drawing_rels_[i].type == typeChart ||
vml_drawing_rels_[i].type == typeHyperlink )
{
Rels.add(relationship( vml_drawing_rels_[i].rid,
mediaitems::get_rel_type(vml_drawing_rels_[i].type),
(vml_drawing_rels_[i].is_internal ? std::wstring(L"../") + vml_drawing_rels_[i].ref : vml_drawing_rels_[i].ref),
(vml_drawing_rels_[i].is_internal ? L"" : L"External")) );
}
}
}
@ -173,9 +278,11 @@ public:
private:
std::vector<_xlsx_drawing> xlsx_drawings_;
std::vector<_xlsx_drawing> drawings_;
std::vector<_xlsx_drawing> vml_drawings_;
std::vector<_rel> xlsx_drawing_rels_;
std::vector<_rel> drawing_rels_;
std::vector<_rel> vml_drawing_rels_;
std::vector<_rel> xlsx_sheet_rels_;
};
@ -194,15 +301,19 @@ void xlsx_drawings::add(_xlsx_drawing const & d, bool isInternal, std::wstring c
impl_->add(d, isInternal, rid, ref, type, sheet_rel);
}
void xlsx_drawings::add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel)
void xlsx_drawings::add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel, bool vml_rel)
{
impl_->add(isInternal, rid, ref, type, sheet_rel);
impl_->add(isInternal, rid, ref, type, sheet_rel, vml_rel);
}
void xlsx_drawings::serialize(std::wostream & strm, const std::wstring & ns)
{
impl_->serialize(strm, ns);
}
void xlsx_drawings::serialize_vml(std::wostream & strm)
{
impl_->serialize_vml(strm);
}
void xlsx_drawings::serialize_objects(std::wostream & strm)
{
@ -217,12 +328,18 @@ bool xlsx_drawings::empty() const
{
return impl_->empty();
}
bool xlsx_drawings::vml_empty() const
{
return impl_->vml_empty();
}
void xlsx_drawings::dump_rels_drawing(rels & Rels)
{
return impl_->dump_rels_drawing(Rels);
}
void xlsx_drawings::dump_rels_vml_drawing(rels & Rels)
{
return impl_->dump_rels_vml_drawing(Rels);
}
void xlsx_drawings::dump_rels_sheet(rels & Rels)
{
return impl_->dump_rels_sheet(Rels);

View File

@ -66,13 +66,17 @@ public:
static xlsx_drawings_ptr create(bool inGroup);
void add ( _xlsx_drawing const & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel = false );
void add ( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel = false );
void add ( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel, bool vml_rel);
bool empty () const;
void dump_rels_sheet (rels & Rels);
void dump_rels_drawing (rels & Rels);
bool empty() const;
bool vml_empty() const;
void dump_rels_sheet (rels & Rels);
void dump_rels_drawing (rels & Rels);
void dump_rels_vml_drawing (rels & Rels);
void serialize (std::wostream & _Wostream, const std::wstring & ns);
void serialize_vml (std::wostream & _Wostream);
void serialize_objects (std::wostream & _Wostream);
void serialize_controls (std::wostream & _Wostream);
private:

View File

@ -49,7 +49,6 @@ public:
std::wstringstream sheetFormat_;
std::wstringstream sheetData_;
std::wstringstream mergeCells_;
std::wstringstream drawing_;
std::wstringstream hyperlinks_;
std::wstringstream comments_;
std::wstringstream sort_;
@ -130,10 +129,6 @@ std::wostream & xlsx_xml_worksheet::autofilter()
{
return impl_->autofilter_;
}
std::wostream & xlsx_xml_worksheet::drawing()
{
return impl_->drawing_;
}
std::wostream & xlsx_xml_worksheet::comments()
{
return impl_->comments_;
@ -217,35 +212,40 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
CP_XML_STREAM() << impl_->hyperlinks_.str();
}
}
if (!impl_->page_props_.str().empty())
if (false == impl_->page_props_.str().empty())
{
CP_XML_STREAM() << impl_->page_props_.str();
}//props выше legacyDrawing !!
CP_XML_STREAM() << impl_->drawing_.str();
if (!impl_->commentsId_.empty())
if (false == impl_->drawingId_.empty())
{
CP_XML_NODE(L"drawing")
{
CP_XML_ATTR(L"r:id", impl_->drawingId_);
}
}
if (false == impl_->vml_drawingId_.empty())
{
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_->ole_objects_.str().empty())
if (false == impl_->ole_objects_.str().empty())
{
CP_XML_NODE(L"oleObjects")
{
CP_XML_STREAM() << impl_->ole_objects_.str();
}
}
if (!impl_->controls_.str().empty())
if (false == impl_->controls_.str().empty())
{
CP_XML_NODE(L"controls")
{
CP_XML_STREAM() << impl_->controls_.str();
}
}
if (!impl_->tableParts_.str().empty())
if (false == impl_->tableParts_.str().empty())
{
CP_XML_NODE(L"tableParts")
{

View File

@ -58,7 +58,6 @@ public:
std::wostream & sheetData();
std::wostream & hyperlinks();
std::wostream & mergeCells();
std::wostream & drawing();
std::wostream & comments();
std::wostream & autofilter();
std::wostream & tableParts();

View File

@ -558,18 +558,20 @@ void xl_control_props_files::write(const std::wstring & RootPath)
}
}
//------------------------------------------------------------------------------------------------------
xl_drawings_ptr xl_drawings::create(const std::vector<drawing_elm> & elms)
xl_drawings_ptr xl_drawings::create(const std::vector<drawing_elm> & elms, const std::vector<drawing_elm> & vml_elms)
{
return boost::make_shared<xl_drawings>(boost::ref(elms));
return boost::make_shared<xl_drawings>(boost::ref(elms), boost::ref(vml_elms));
}
void xl_drawings::write(const std::wstring & RootPath)
{
content_type * contentTypes = this->get_main_document()->get_content_types_file().content();
if (drawings_.empty() && vml_drawings_.empty()) return;
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"drawings";
NSDirectory::CreateDirectory(path.c_str());
content_type * contentTypes = this->get_main_document()->get_content_types_file().content();
pptx_document *pptx = dynamic_cast<pptx_document*>(this->get_main_document());
xlsx_document *xlsx = dynamic_cast<xlsx_document*>(this->get_main_document());
docx_document *docx = dynamic_cast<docx_document*>(this->get_main_document());
@ -594,6 +596,20 @@ void xl_drawings::write(const std::wstring & RootPath)
contentTypes->add_override(override_str + drawings_[i].filename, kDrawingCT);
}
for (size_t i = 0; i < vml_drawings_.size(); i++)
{
package::simple_element(vml_drawings_[i].filename, vml_drawings_[i].content).write(path);
rels_files relFiles;
rels_file_ptr r = rels_file::create(vml_drawings_[i].filename + L".rels");
vml_drawings_[i].drawings->dump_rels_vml_drawing(r->get_rels());
relFiles.add_rel_file(r);
relFiles.write(path);
//content types - default
}
}
//////////////////////////////
@ -604,9 +620,6 @@ xl_comments_ptr xl_comments::create(const std::vector<comment_elm> & elms)
void xl_comments::write(const std::wstring & RootPath)
{
std::wstring vml_path = RootPath + FILE_SEPARATOR_STR + L"drawings";
NSDirectory::CreateDirectory(vml_path.c_str());
for (size_t i = 0; i < comments_.size(); i++)
{
content_type * contentTypes = this->get_main_document()->get_content_types_file().content();
@ -615,7 +628,6 @@ void xl_comments::write(const std::wstring & RootPath)
contentTypes->add_override(std::wstring(L"/xl/") + comments_[i].filename, kWSConType);
package::simple_element(comments_[i].filename, comments_[i].content).write(RootPath);
package::simple_element(comments_[i].vml_filename, comments_[i].vml_content).write(vml_path);
}
}

View File

@ -244,20 +244,27 @@ class xl_drawings: public element
{
public:
virtual void write(const std::wstring & RootPath);
void set_rels(rels_files * rels)
{
rels_ = rels;
}
xl_drawings(const std::vector<drawing_elm> & elms) : drawings_ ( elms )
//void set_rels(rels_files * rels)
// {
// rels_ = rels;
// }
//void set_vml_rels(rels_files * rels)
// {
// vml_rels_ = rels;
// }
xl_drawings(const std::vector<drawing_elm> & elms, const std::vector<drawing_elm> & vml_elms) : drawings_(elms), vml_drawings_(vml_elms)
{
}
static xl_drawings_ptr create(const std::vector<drawing_elm> & elms);
static xl_drawings_ptr create(const std::vector<drawing_elm> & elms, const std::vector<drawing_elm> & vml_elms);
private:
const std::vector<drawing_elm> & drawings_;
rels_files * rels_;
const std::vector<drawing_elm> & vml_drawings_;
//rels_files * rels_;
//rels_files * vml_rels_;
};
//----------------------------------------------------------------------------------------------------------
class xl_control_props_files : public element

View File

@ -332,8 +332,8 @@ void xlsx_conversion_context::end_document()
output_document_->get_content_types_file().set_media(get_mediaitems());
output_document_->get_xl_files().set_media(get_mediaitems());
package::xl_drawings_ptr drawings = package::xl_drawings::create(drawing_context_handle_->content());
output_document_->get_xl_files().set_drawings(drawings);
package::xl_drawings_ptr drawings = package::xl_drawings::create(drawing_context_handle_->content(), drawing_context_handle_->content_vml());
output_document_->get_xl_files().set_drawings(drawings);
package::xl_comments_ptr comments = package::xl_comments::create(xlsx_comments_context_handle_.content());
output_document_->get_xl_files().set_comments(comments);
@ -514,33 +514,28 @@ void xlsx_conversion_context::end_table()
= drawing_context_handle_->add_drawing_xml(strm.str(), get_drawing_context().get_drawings() );
current_sheet().set_drawing_link(drawingName.first, drawingName.second);
CP_XML_WRITER(current_sheet().drawing())
{
CP_XML_NODE(L"drawing")
{
CP_XML_ATTR(L"r:id", drawingName.second);
}
}
}
get_table_context().serialize_background (current_sheet().drawing());
if (false == get_drawing_context().vml_empty())
{
std::wstringstream strm;
get_drawing_context().serialize_vml(strm);
const std::pair<std::wstring, std::wstring> vml_drawingName
= drawing_context_handle_->add_drawing_vml(strm.str(), get_drawing_context().get_drawings() );
if (!get_comments_context().empty())
current_sheet().set_vml_drawing_link(vml_drawingName.first, vml_drawingName.second);
}
//get_table_context().serialize_background (current_sheet().picture());
if (false == get_comments_context().empty())
{
std::wstringstream strm;
get_comments_context().serialize(strm);
std::wstringstream vml_strm;
get_comments_context().serialize_vml(vml_strm);
const std::pair<std::wstring, std::wstring> commentsName
= xlsx_comments_context_handle_.add_comments_xml(strm.str(), vml_strm.str(),get_comments_context().get_comments() );
const std::pair<std::wstring, std::wstring> vml_drawingName
=xlsx_comments_context_handle_.get_vml_drawing_xml();
= xlsx_comments_context_handle_.add_comments_xml(strm.str(), get_comments_context().get_comments() );
current_sheet().set_comments_link(commentsName.first, commentsName.second);
current_sheet().set_vml_drawing_link(vml_drawingName.first, vml_drawingName.second);
}
get_table_context().end_table();
}

View File

@ -74,6 +74,10 @@ void abstract_xml::add_text(const std::wstring & Text)
office_element_ptr elm = text::text::create(Text) ;
xml_content_.push_back( elm );
}
void abstract_xml::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::text::create(Text) ;
xml_content_.push_back( elm );
}
}
}

View File

@ -46,19 +46,17 @@ public:
static const ElementType type = type_AbstractXml;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const;
virtual std::wostream & xml_to_stream(std::wostream & _Wostream) const;
public:
abstract_xml() {};
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_space(const std::wstring & Text);
private:
office_element_ptr_array xml_content_;
};

View File

@ -421,11 +421,13 @@ void object_odf_context::oox_convert(oox::oox_chart_context & chart_context)
std::vector<std::wstring> domain_cash;
std::vector<std::wstring> cell_cash;
std::vector<std::wstring> cat_cash;
std::vector<std::wstring> label_cash;
calc_cache_series (domain_cell_range_adress_, domain_cash);
calc_cache_series (series_[i].cell_range_address_, cell_cash);
calc_cache_series (series_[i].label_cell_address_, label_cash);
if (categories_.size() >0)
if (false == categories_.empty())
calc_cache_series (categories_[0], cat_cash);
std::wstring formatCode = L"General";
@ -439,6 +441,11 @@ void object_odf_context::oox_convert(oox::oox_chart_context & chart_context)
{
formatCode = *strVal;
}
if (false == series_[i].label_cell_address_.empty())
{
current->set_label_series(series_[i].label_cell_address_, label_cash);//_oox_strRef
}
if (domain_cell_range_adress_.empty() == false ||
last_set_type == chart_scatter)
@ -455,14 +462,14 @@ void object_odf_context::oox_convert(oox::oox_chart_context & chart_context)
}
else
{ //x
if (false == domain_cash.empty() || cash_values.empty())
if (false == domain_cash.empty() || false == cash_values.empty())
{
if (!bPivotChart_)
current->set_formula_series(2, domain_cell_range_adress_, formatCode, boolVal.get_value_or(true));
current->set_values_series (2, domain_cash);
}
//y
if (false == cell_cash.empty() || cash_values.empty())
if (false == cell_cash.empty() || false == cash_values.empty())
{
if (!bPivotChart_)
current->set_formula_series(3, series_[i].cell_range_address_, formatCode, boolVal.get_value_or(true));

View File

@ -265,7 +265,13 @@ void common_break_attlist::serialize(CP_ATTR_NODE)
void common_page_number_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:page-number", style_page_number_);
_CP_OPT(std::wstring) str;
CP_APPLY_ATTR(L"style:page-number", str);
if ((str) && (*str != L"auto"))
{
style_page_number_ = XmlUtils::GetInteger(*str);
}
}
void common_page_number_attlist::apply_from(const common_page_number_attlist & Other)
{

View File

@ -333,10 +333,6 @@ void draw_text_box::add_child_element( xml::sax * Reader, const std::wstring & N
CP_CREATE_ELEMENT(content_);
}
void draw_text_box::add_text(const std::wstring & Text)
{
}
// draw:object
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * draw_object::ns = L"draw";

View File

@ -273,7 +273,8 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
};
CP_REGISTER_OFFICE_ELEMENT2(draw_text_box);

View File

@ -1477,7 +1477,7 @@ void draw_frame::docx_convert(oox::docx_conversion_context & Context)
bool bImage = false;
if (content_.empty() == false)
{
if (content_[0]->get_type() == typeDrawImage)
if (content_[0]->get_type() == typeDrawImage || content_[0]->get_type() == typeDrawObject || content_[0]->get_type() == typeDrawObjectOle )
bImage = true;
}
if (Context.get_drawing_context().get_current_level() > 0 && !Context.get_drawing_context().in_group() && !bImage)

View File

@ -224,7 +224,11 @@ void presentation_footer_decl::add_attributes( const xml::attributes_wc_ptr & At
}
void presentation_footer_decl::add_text(const std::wstring & text)
{
text_ = text;
text_ += text;
}
void presentation_footer_decl::add_space(const std::wstring & text)
{
text_ += text;
}
void presentation_footer_decl::pptx_convert(oox::pptx_conversion_context & Context)
{
@ -242,7 +246,11 @@ void presentation_date_time_decl::add_attributes( const xml::attributes_wc_ptr &
}
void presentation_date_time_decl::add_text(const std::wstring & text)
{
text_ = text;
text_ += text;
}
void presentation_date_time_decl::add_space(const std::wstring & text)
{
text_ += text;
}
void presentation_date_time_decl::pptx_convert(oox::pptx_conversion_context & Context)
{

View File

@ -104,6 +104,7 @@ public:
std::wstring text_;
private:
virtual void add_space(const std::wstring & Text);
virtual void add_text(const std::wstring & Text);
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}
@ -131,6 +132,7 @@ public:
virtual void pptx_convert(oox::pptx_conversion_context & Context);
private:
virtual void add_space(const std::wstring & Text);
virtual void add_text(const std::wstring & Text);
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}

View File

@ -712,11 +712,11 @@ public:
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context){}
_CP_OPT(std::wstring) xml_id_;
_CP_OPT(std::wstring) caption_id_;
_CP_OPT(std::wstring) control_id_;
_CP_OPT(std::wstring) xml_id_;
_CP_OPT(std::wstring) caption_id_;
_CP_OPT(std::wstring) control_id_;
office_element_ptr draw_glue_point_;
office_element_ptr draw_glue_point_;
//<svg:desc>
//<svg:title>
private:

View File

@ -112,7 +112,7 @@ void draw_shape::common_xlsx_convert(oox::xlsx_conversion_context & Context)
std::vector<const odf_reader::style_instance *> instances;
odf_reader::style_instance* styleInst =
Context.root()->odf_context().styleContainer().style_by_name(styleName, odf_types::style_family::Graphic,false/*Context.process_headers_footers_*/);
Context.root()->odf_context().styleContainer().style_by_name(styleName, odf_types::style_family::Graphic, false/*Context.process_headers_footers_*/);
if (styleInst)
{
style_instance * defaultStyle = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic);
@ -396,28 +396,75 @@ void draw_control::xlsx_convert(oox::xlsx_conversion_context & Context)
oox::forms_context::_state & state = Context.get_forms_context().get_state_element(*control_id_);
if (state.id.empty()) return;
form_element* control = dynamic_cast<form_element*>(state.element);
if (!control) return;
if (state.ctrlPropId.empty())
{
std::wstring target;
state.ctrlPropId = Context.get_mediaitems()->add_control_props(target);
std::wstringstream strm;
form_element* control = dynamic_cast<form_element*>(state.element);
if (control)
{
control->serialize_control_props(strm);
}
control->serialize_control_props(strm);
Context.add_control_props(state.ctrlPropId, target, strm.str());
}
Context.get_drawing_context().start_frame();
Context.get_drawing_context().set_control(state.ctrlPropId);
Context.get_drawing_context().start_control(state.ctrlPropId, control->object_type_);
common_xlsx_convert(Context);
if (control->linked_cell_)
{
Context.get_drawing_context().end_frame();
Context.get_drawing_context().set_property(_property(L"linked_cell", control->linked_cell_.get()));
}
if (control->disabled_)
{
Context.get_drawing_context().set_property(_property(L"disabled", control->disabled_->get()));
}
if (control->value_)
{
Context.get_drawing_context().set_property(_property(L"value", control->value_.get()));
}
else if (control->current_value_)
{
Context.get_drawing_context().set_property(_property(L"value", control->current_value_.get()));
}
//if (control->name_)
//{
// Context.get_drawing_context().set_name(control->name_.get());
//}
form_value_range* value_range = dynamic_cast<form_value_range*>(control);
if (value_range)
{
if (value_range->min_value_)
{
Context.get_drawing_context().set_property(_property(L"min_value", value_range->min_value_.get()));
}
if (value_range->max_value_)
{
Context.get_drawing_context().set_property(_property(L"max_value", value_range->max_value_.get()));
}
if (value_range->step_size_)
{
Context.get_drawing_context().set_property(_property(L"step", value_range->step_size_.get()));
}
if (value_range->page_step_size_)
{
Context.get_drawing_context().set_property(_property(L"page_step", value_range->page_step_size_.get()));
}
if (value_range->orientation_)
{
Context.get_drawing_context().set_property(_property(L"orientation", value_range->orientation_.get()));
}
}
//_CP_OPT(std::wstring) label_;
//_CP_OPT(std::wstring) title_;
//_CP_OPT(odf_types::Bool) dropdown_;
Context.get_drawing_context().end_control();
Context.get_drawing_context().clear();
}

View File

@ -52,9 +52,12 @@ std::wostream & svg_desc::text_to_stream(std::wostream & _Wostream, bool bXmlEnc
void svg_desc::add_text(const std::wstring & Text)
{
text_ = Text;
text_ += Text;
}
void svg_desc::add_space(const std::wstring & Text)
{
text_ += Text;
}
// svg:font-face-uri
//---------------------------------------------------------------------------------------
const wchar_t * svg_font_face_uri::ns = L"svg";
@ -80,9 +83,6 @@ void svg_font_face_uri::add_child_element( xml::sax * Reader, const std::wstring
CP_NOT_APPLICABLE_ELM();
}
void svg_font_face_uri::add_text(const std::wstring & Text)
{}
// svg:font-face-format
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * svg_font_face_format::ns = L"svg";
@ -103,9 +103,6 @@ void svg_font_face_format::add_child_element( xml::sax * Reader, const std::wstr
CP_NOT_APPLICABLE_ELM();
}
void svg_font_face_format::add_text(const std::wstring & Text)
{}
// svg:font-face-name
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * svg_font_face_name::ns = L"svg";
@ -126,9 +123,6 @@ void svg_font_face_name::add_child_element( xml::sax * Reader, const std::wstrin
CP_NOT_APPLICABLE_ELM();
}
void svg_font_face_name::add_text(const std::wstring & Text)
{}
//////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -77,7 +77,6 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
};
CP_REGISTER_OFFICE_ELEMENT2(svg_font_face_uri);
@ -100,6 +99,7 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ){}
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}
virtual void add_text(const std::wstring & Text);
virtual void add_space(const std::wstring & Text);
};
CP_REGISTER_OFFICE_ELEMENT2(svg_desc);
@ -121,7 +121,6 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
};
CP_REGISTER_OFFICE_ELEMENT2(svg_font_face_format);
@ -142,7 +141,6 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
};
CP_REGISTER_OFFICE_ELEMENT2(svg_font_face_name);

View File

@ -75,7 +75,11 @@ void note_citation::add_text(const std::wstring & Text)
office_element_ptr elm = text::create(Text) ;
content_.push_back( elm );
}
void note_citation::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text) ;
content_.push_back( elm );
}
void note_citation::docx_convert(oox::docx_conversion_context & Context)
{
for (size_t i = 0; i < content_.size(); i++)
@ -113,6 +117,11 @@ void note_body::add_text(const std::wstring & Text)
content_.push_back( elm );
}
void note_body::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text) ;
content_.push_back( elm );
}
void note_body::docx_convert(oox::docx_conversion_context & Context)
{
oox::StreamsManPtr prev = Context.get_stream_man();

View File

@ -50,22 +50,20 @@ public:
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextNoteCitation;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context) ;
public:
virtual void docx_convert(oox::docx_conversion_context & Context) ;
virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const;
public:
note_citation() {}
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_space(const std::wstring & Text);
private:
std::wstring text_label_;
office_element_ptr_array content_;
std::wstring text_label_;
office_element_ptr_array content_;
};
@ -81,19 +79,18 @@ public:
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextNoteBody;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context) ;
public:
virtual void docx_convert(oox::docx_conversion_context & Context) ;
virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const;
public:
note_body() {}
note_body() {}
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_space(const std::wstring & Text);
private:
office_element_ptr_array content_;
};

View File

@ -184,9 +184,7 @@ void number_style_base::add_child_element( xml::sax * Reader, const std::wstring
CP_CREATE_ELEMENT(content_);
}
}
void number_style_base::add_text(const std::wstring & Text)
{
}
// number:number-style
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * number_number_style::ns = L"number";
@ -211,7 +209,11 @@ void number_text::add_text(const std::wstring & Text)
office_element_ptr elm = text::text::create(Text) ;
text_.push_back( elm );
}
void number_text::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::text::create(Text) ;
text_.push_back( elm );
}
// number:embedded-text
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * number_embedded_text::ns = L"number";
@ -232,6 +234,11 @@ void number_embedded_text::add_text(const std::wstring & Text)
office_element_ptr elm = text::text::create(Text) ;
text_.push_back( elm );
}
void number_embedded_text::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::text::create(Text) ;
text_.push_back( elm );
}
void number_embedded_text::oox_convert(oox::num_format_context & Context)
{
}
@ -261,10 +268,6 @@ void number_number::add_child_element( xml::sax * Reader, const std::wstring & N
CP_NOT_APPLICABLE_ELM();
}
void number_number::add_text(const std::wstring & Text)
{
}
// number:scientific-number
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * number_scientific_number::ns = L"number";
@ -304,7 +307,10 @@ void number_currency_symbol::add_text(const std::wstring & Text)
{
text_.push_back(Text);
}
void number_currency_symbol::add_space(const std::wstring & Text)
{
text_.push_back(Text);
}
void number_currency_symbol::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -342,7 +348,11 @@ void number_text_content::add_text(const std::wstring & Text)
office_element_ptr elm = text::text::create(Text) ;
text_.push_back( elm );
}
void number_text_content::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::text::create(Text) ;
text_.push_back( elm );
}
void number_text_content::oox_convert(oox::num_format_context & Context)
{
}
@ -443,9 +453,6 @@ void number_day::add_child_element( xml::sax * Reader, const std::wstring & Ns,
{
CP_NOT_APPLICABLE_ELM();
}
void number_day::add_text(const std::wstring & Text)
{
}
void number_day::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -475,9 +482,6 @@ void number_day_of_week::add_child_element( xml::sax * Reader, const std::wstrin
{
CP_NOT_APPLICABLE_ELM();
}
void number_day_of_week::add_text(const std::wstring & Text)
{
}
void number_day_of_week::oox_convert(oox::num_format_context & Context)
{
@ -508,10 +512,6 @@ void number_quarter::add_child_element( xml::sax * Reader, const std::wstring &
CP_NOT_APPLICABLE_ELM();
}
void number_quarter::add_text(const std::wstring & Text)
{
}
void number_quarter::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -544,9 +544,7 @@ void number_month::add_child_element( xml::sax * Reader, const std::wstring & Ns
{
CP_NOT_APPLICABLE_ELM();
}
void number_month::add_text(const std::wstring & Text)
{
}
void number_month::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -589,9 +587,7 @@ void number_year::add_child_element( xml::sax * Reader, const std::wstring & Ns,
{
CP_NOT_APPLICABLE_ELM();
}
void number_year::add_text(const std::wstring & Text)
{
}
void number_year::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -630,9 +626,6 @@ void number_hours::add_child_element( xml::sax * Reader, const std::wstring & Ns
{
CP_NOT_APPLICABLE_ELM();
}
void number_hours::add_text(const std::wstring & Text)
{
}
void number_hours::oox_convert(oox::num_format_context & Context)
{
@ -663,9 +656,7 @@ void number_minutes::add_child_element( xml::sax * Reader, const std::wstring &
{
CP_NOT_APPLICABLE_ELM();
}
void number_minutes::add_text(const std::wstring & Text)
{
}
void number_minutes::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -696,9 +687,7 @@ void number_seconds::add_child_element( xml::sax * Reader, const std::wstring &
{
CP_NOT_APPLICABLE_ELM();
}
void number_seconds::add_text(const std::wstring & Text)
{
}
void number_seconds::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -732,9 +721,7 @@ void number_am_pm::add_child_element( xml::sax * Reader, const std::wstring & Ns
{
CP_NOT_APPLICABLE_ELM();
}
void number_am_pm::add_text(const std::wstring & Text)
{
}
void number_am_pm::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -760,9 +747,7 @@ void number_fraction::add_child_element( xml::sax * Reader, const std::wstring &
{
CP_NOT_APPLICABLE_ELM();
}
void number_fraction::add_text(const std::wstring & Text)
{
}
void number_fraction::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
@ -786,10 +771,6 @@ void number_fraction::oox_convert(oox::num_format_context & Context)
}
}
void number_scientific_number::add_text(const std::wstring & Text)
{
}
void number_scientific_number::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();

View File

@ -58,8 +58,9 @@ public:
std::wstring get_style_name() const;
private:
virtual void add_text(const std::wstring &);
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_child_element (xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
odf_types::common_data_style_attlist common_data_style_attlist_;
@ -182,12 +183,12 @@ public:
virtual void oox_convert (oox::num_format_context & Context) = 0;
CPDOCCORE_DEFINE_VISITABLE();
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes ) = 0;
virtual void add_text (const std::wstring &) = 0;
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) = 0;
virtual void add_text (const std::wstring & Text) = 0;
virtual void add_space (const std::wstring & Text) = 0;
};
@ -210,6 +211,7 @@ private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_space (const std::wstring & Text);
office_element_ptr_array text_;
};
@ -234,7 +236,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
// number-number-attlist
_CP_OPT(std::wstring) number_decimal_replacement_;
@ -272,6 +275,7 @@ private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_space (const std::wstring & Text);
_CP_OPT(int) number_position_;
office_element_ptr_array text_;
@ -297,16 +301,13 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
private:
// number-scientific-number-attlist
_CP_OPT(int) number_min_exponent_digits_;
// common-decimal-places-attlist
_CP_OPT(int) number_decimal_places_;
// common-number-attlist
_CP_OPT(int) number_min_integer_digits_;
_CP_OPT(bool) number_grouping_;
@ -333,6 +334,7 @@ private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_space (const std::wstring & Text);
_CP_OPT(std::wstring) number_language_;
_CP_OPT(std::wstring) number_country_;
@ -362,6 +364,7 @@ private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_space (const std::wstring & Text);
office_element_ptr_array text_;
@ -387,7 +390,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(std::wstring) number_style_;
_CP_OPT(std::wstring) number_calendar_;
@ -414,7 +418,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(std::wstring) number_style_;
_CP_OPT(std::wstring) number_calendar_;
@ -441,7 +446,8 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(std::wstring) number_style_;
_CP_OPT(std::wstring) number_calendar_;
@ -467,7 +473,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(bool) number_textual_;
_CP_OPT(bool) number_possessive_form_;
@ -496,7 +503,8 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(std::wstring) number_style_;
_CP_OPT(std::wstring) number_calendar_;
@ -518,15 +526,13 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
CPDOCCORE_OFFICE_DOCUMENT_IMPL_NAME_FUNCS_;
void oox_convert(oox::num_format_context & Context);
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
public:
void oox_convert(oox::num_format_context & Context);
private:
_CP_OPT(std::wstring) number_style_;
_CP_OPT(std::wstring) number_calendar_;
@ -551,7 +557,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(std::wstring) number_style_;
_CP_OPT(std::wstring) number_calendar_;
@ -578,7 +585,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(std::wstring) number_style_;
_CP_OPT(int) number_decimal_places_;
@ -606,7 +614,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
};
CP_REGISTER_OFFICE_ELEMENT2(number_am_pm);
@ -629,7 +638,8 @@ public:
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text (const std::wstring & Text);
virtual void add_text (const std::wstring & Text) {}
virtual void add_space (const std::wstring & Text) {}
_CP_OPT(int) number_min_integer_digits_;
_CP_OPT(bool) number_grouping_;

View File

@ -94,10 +94,7 @@ void content_xml_t::add_child_element( xml::sax * Reader, const std::wstring & N
}
}
void content_xml_t::add_text(const std::wstring & Text)
{
}
}
}

View File

@ -59,8 +59,9 @@ public:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_text(const std::wstring & Text);
virtual void add_text(const std::wstring & Text) {}
virtual void add_space(const std::wstring & Text) {}
friend class odf_document;
office_element_ptr content_;

View File

@ -41,7 +41,7 @@
#include <odf/odf_document.h>
#include "odfcontext.h"
#include "draw_common.h"
#include "calcs_styles.h"
#include "../docx/xlsx_utils.h"
@ -111,7 +111,7 @@ void office_annotation::add_child_element( xml::sax * Reader, const std::wstring
void office_annotation::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
office_annotation_attr_.add_attributes(Attributes);
attr_.add_attributes(Attributes);
}
void office_annotation::docx_convert(oox::docx_conversion_context & Context)
@ -159,19 +159,20 @@ void office_annotation::docx_convert(oox::docx_conversion_context & Context)
void office_annotation::xlsx_convert(oox::xlsx_conversion_context & Context)
{
const _CP_OPT(length) svg_widthVal = office_annotation_attr_.svg_width_;
const _CP_OPT(length) svg_widthVal = attr_.svg_width_;
const double width_cm = svg_widthVal.get_value_or(length(0)).get_value_unit(length::cm);
const double width_pt = svg_widthVal.get_value_or(length(0)).get_value_unit(length::pt);
const _CP_OPT(length) svg_heightVal =office_annotation_attr_.svg_height_;
const _CP_OPT(length) svg_heightVal =attr_.svg_height_;
const double height_cm = svg_heightVal.get_value_or(length(0)).get_value_unit(length::cm);
const double height_pt = svg_heightVal.get_value_or(length(0)).get_value_unit(length::pt);
const double x_pt = office_annotation_attr_.svg_x_.get_value_or(length(0)).get_value_unit(length::pt);
const double y_pt = office_annotation_attr_.svg_y_.get_value_or(length(0)).get_value_unit(length::pt);
/////////////////////////////////
const double x_pt = attr_.svg_x_.get_value_or(length(0)).get_value_unit(length::pt);
const double y_pt = attr_.svg_y_.get_value_or(length(0)).get_value_unit(length::pt);
//-----------------------------------------------
std::wstring date;
std::wstring author;
if (dc_date_)
@ -182,11 +183,14 @@ void office_annotation::xlsx_convert(oox::xlsx_conversion_context & Context)
{
author = xml::utils::replace_text_to_xml(dynamic_cast<dc_creator * >(dc_creator_.get())->content_);
}
////////////////////////////////////////
Context.get_comments_context().start_comment(width_pt, height_pt, x_pt, y_pt);
if (office_annotation_attr_.display_)
int col = Context.current_table_column(); if (col < 0) col = 0;
int row = Context.current_table_row(); if (row < 0) row = 0;
std::wstring ref = oox::getCellAddress(col, row);
//-----------------------------------------------
Context.get_comments_context().start_comment(ref);
if (attr_.display_)
{
Context.get_comments_context().set_visibly(office_annotation_attr_.display_.get());
}
Context.get_text_context().start_comment_content();
@ -196,13 +200,43 @@ void office_annotation::xlsx_convert(oox::xlsx_conversion_context & Context)
}
Context.get_comments_context().add_author(author);
Context.get_comments_context().add_content(Context.get_text_context().end_comment_content());
//----------- drawing part ---------------
Context.get_drawing_context().start_comment(col, row);
Context.get_drawing_context().start_drawing(L"");
Context.get_drawing_context().set_rect(width_pt, height_pt, x_pt, y_pt);
if (attr_.display_)
{
Context.get_drawing_context().set_property(_property(L"visibly", attr_.display_.get()));
}
//////////////////////////////////////////////////////////////////
/// Обрабатываем стиль draw
if (attr_.draw_style_name_)
{
std::vector<const odf_reader::style_instance *> instances;
odf_reader::style_instance* styleInst =
Context.root()->odf_context().styleContainer().style_by_name(*attr_.draw_style_name_, odf_types::style_family::Graphic, false/*Context.process_headers_footers_*/);
if (styleInst)
{
style_instance * defaultStyle = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic);
if (defaultStyle)instances.push_back(defaultStyle);
instances.push_back(styleInst);
}
graphic_format_properties properties = calc_graphic_properties_content(instances);
//-----------------------------------------------
properties.apply_to(Context.get_drawing_context().get_properties());
oox::_oox_fill fill;
Compute_GraphicFill(properties.common_draw_fill_attlist_, properties.style_background_image_,
Context.root()->odf_context().drawStyles(), fill);
Context.get_drawing_context().set_fill(fill);
}
//-----------------------------------------------
std::vector<const odf_reader::style_instance *> instances;
style_instance* styleInst = Context.root()->odf_context().styleContainer().style_by_name(
office_annotation_attr_.draw_style_name_.get_value_or(L""), odf_types::style_family::Graphic, false/*Context.process_headers_footers_*/);
attr_.draw_style_name_.get_value_or(L""), odf_types::style_family::Graphic, false/*Context.process_headers_footers_*/);
if (styleInst)
{
style_instance * defaultStyle = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic);
@ -212,16 +246,13 @@ void office_annotation::xlsx_convert(oox::xlsx_conversion_context & Context)
}
graphic_format_properties graphicProperties = calc_graphic_properties_content(instances);
graphicProperties.apply_to(Context.get_comments_context().get_draw_properties());
const std::wstring textStyleName = office_annotation_attr_.draw_text_style_name_.get_value_or(L"");
int col = Context.current_table_column(); if (col < 0) col = 0;
int row = Context.current_table_row(); if (row < 0) row = 0;
std::wstring ref = oox::getCellAddress(col, row);
Context.get_comments_context().end_comment(ref, col, row);
const std::wstring textStyleName = attr_.draw_text_style_name_.get_value_or(L"");
Context.get_drawing_context().end_drawing();
Context.get_drawing_context().end_comment();
Context.get_drawing_context().clear();
//-----------------------------------------------
Context.get_comments_context().end_comment();
}
// officeooo:annotation
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -246,13 +277,13 @@ void officeooo_annotation::add_child_element( xml::sax * Reader, const std::wstr
void officeooo_annotation::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
office_annotation_attr_.add_attributes(Attributes);
attr_.add_attributes(Attributes);
}
void officeooo_annotation::pptx_convert(oox::pptx_conversion_context & Context)
{
const double x = 8 * office_annotation_attr_.svg_x_.get_value_or(length(0)).get_value_unit(length::pt);
const double y = 8 * office_annotation_attr_.svg_y_.get_value_or(length(0)).get_value_unit(length::pt);
const double x = 8 * attr_.svg_x_.get_value_or(length(0)).get_value_unit(length::pt);
const double y = 8 * attr_.svg_y_.get_value_or(length(0)).get_value_unit(length::pt);
/////////////////////////////////
std::wstring date;
std::wstring author;
@ -283,7 +314,7 @@ void officeooo_annotation::pptx_convert(oox::pptx_conversion_context & Context)
/// Обрабатываем стиль draw
std::vector<const odf_reader::style_instance *> instances;
style_instance* styleInst = Context.root()->odf_context().styleContainer().style_by_name(
office_annotation_attr_.draw_style_name_.get_value_or(L""), odf_types::style_family::Graphic,false/*Context.process_headers_footers_*/);
attr_.draw_style_name_.get_value_or(L""), odf_types::style_family::Graphic,false/*Context.process_headers_footers_*/);
if (styleInst)
{
style_instance * defaultStyle = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic);
@ -295,7 +326,7 @@ void officeooo_annotation::pptx_convert(oox::pptx_conversion_context & Context)
graphicProperties.apply_to(Context.get_comments_context().get_draw_properties());
const std::wstring textStyleName = office_annotation_attr_.draw_text_style_name_.get_value_or(L"");
const std::wstring textStyleName = attr_.draw_text_style_name_.get_value_or(L"");
Context.get_comments_context().end_comment();
}

View File

@ -46,7 +46,6 @@ class office_annotation_attr
public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
_CP_OPT(odf_types::length) svg_y_;
_CP_OPT(odf_types::length) svg_x_;
_CP_OPT(odf_types::length) svg_width_;
@ -123,9 +122,8 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
private:
office_element_ptr_array content_;
office_annotation_attr office_annotation_attr_;
office_annotation_attr attr_;
office_element_ptr dc_date_;
office_element_ptr dc_creator_;
@ -150,9 +148,8 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
private:
office_element_ptr_array content_;
office_annotation_attr office_annotation_attr_;
office_annotation_attr attr_;
office_element_ptr dc_date_;
office_element_ptr dc_creator_;

View File

@ -75,11 +75,6 @@ void office_body::add_child_element( xml::sax * Reader, const std::wstring & Ns,
CP_CREATE_ELEMENT(content_);
}
void office_body::add_text(const std::wstring & Text)
{
// TODO : error
}
void office_body::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.start_body();

View File

@ -61,17 +61,15 @@ public:
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const;
public:
office_body();
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_text(const std::wstring & Text) {}
virtual void add_space(const std::wstring & Text) {}
public:
office_element_ptr content_;
};

View File

@ -82,10 +82,6 @@ void office_document_base::add_child_element( xml::sax * Reader, const std::wstr
CP_NOT_APPLICABLE_ELM();
}
void office_document_base::add_text(const std::wstring & Text)
{
}
void office_document_base::docx_convert(oox::docx_conversion_context & Context)
{
if (office_body_)

View File

@ -47,18 +47,17 @@ public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
office_document_base();
office_document_base();
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_text(const std::wstring & Text) {}
virtual void add_space(const std::wstring & Text) {}
public:
std::wstring office_mimetype_;
@ -190,6 +189,7 @@ public:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
static const wchar_t * ns;
static const wchar_t * name;
@ -216,6 +216,7 @@ public:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
static const wchar_t * ns;
static const wchar_t * name;
@ -243,6 +244,7 @@ public:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
static const wchar_t * ns;
static const wchar_t * name;
@ -265,6 +267,7 @@ public:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
static const wchar_t * ns;
static const wchar_t * name;
@ -289,6 +292,7 @@ public:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
static const wchar_t * ns;
static const wchar_t * name;

View File

@ -168,7 +168,9 @@ private:
virtual void add_text(const std::wstring & Text)
{
}
virtual void add_space(const std::wstring & Text)
{
}
// office_element impl
public:
virtual ElementType get_type() const

View File

@ -41,6 +41,30 @@
#include "serialize_elements.h"
#include "../formulasconvert/formulasconvert.h"
#define OBJ_Group 0x0000
#define OBJ_Line 0x0001
#define OBJ_Rectangle 0x0002
#define OBJ_Oval 0x0003
#define OBJ_Arc 0x0004
#define OBJ_Text 0x0006
#define OBJ_OfficeArt 0x001E
#define OBJ_Polygon 0x0009
#define OBJ_Picture 0x0008
#define OBJ_Chart 0x0005
#define OBJ_Button 0x0007
#define OBJ_CheckBox 0x000B
#define OBJ_RadioButton 0x000C
#define OBJ_EditBox 0x000D
#define OBJ_Label 0x000E
#define OBJ_DialogBox 0x000F
#define OBJ_SpinControl 0x0010
#define OBJ_Scrollbar 0x0011
#define OBJ_List 0x0012
#define OBJ_GroupBox 0x0013
#define OBJ_DropdownList 0x0014
#define OBJ_Note 0x0019
namespace cpdoccore {
namespace odf_reader {
@ -207,7 +231,7 @@ const wchar_t * form_element::name = L"element";
void form_element::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"form:control_implementation", control_implementation_);
CP_APPLY_ATTR(L"form:control-implementation", control_implementation_);
CP_APPLY_ATTR(L"form:data-field", data_field_);
CP_APPLY_ATTR(L"form:linked-cell", linked_cell_);
CP_APPLY_ATTR(L"form:disabled", disabled_);
@ -273,6 +297,7 @@ const wchar_t * form_button::name = L"button";
void form_button::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = OBJ_Button;
form_element::add_attributes(Attributes);
}
void form_button::docx_convert(oox::docx_conversion_context & Context)
@ -302,7 +327,8 @@ void form_button::serialize_control_props(std::wostream & strm)
CP_XML_ATTR(L"dx", L"20");
CP_XML_ATTR(L"noThreeD", L"1");
}
}}
}
}
// form:text
//----------------------------------------------------------------------------------
const wchar_t * form_text::ns = L"form";
@ -310,6 +336,7 @@ const wchar_t * form_text::name = L"text";
void form_text::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = OBJ_EditBox;
form_element::add_attributes(Attributes);
}
void form_text::docx_convert(oox::docx_conversion_context & Context)
@ -342,7 +369,8 @@ void form_text::serialize_control_props(std::wostream & strm)
if (value_)
CP_XML_ATTR(L"val", *value_);
}
}}
}
}
void form_text::docx_convert_sdt(oox::docx_conversion_context & Context, draw_control *draw)
{
if (!draw) return;
@ -397,6 +425,107 @@ void form_text::docx_convert_field(oox::docx_conversion_context & Context, draw_
Context.finish_run();
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
}
// form:fixed-text
//----------------------------------------------------------------------------------
const wchar_t * form_textarea::ns = L"form";
const wchar_t * form_textarea::name = L"textarea";
// form:fixed-text
//----------------------------------------------------------------------------------
const wchar_t * form_fixed_text::ns = L"form";
const wchar_t * form_fixed_text::name = L"fixed-text";
void form_fixed_text::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = OBJ_Label;
form_element::add_attributes(Attributes);
}
void form_fixed_text::docx_convert(oox::docx_conversion_context & Context)
{
Context.get_forms_context().start_element(2);
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::docx_convert(Context);
}
void form_fixed_text::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_forms_context().start_element(2);
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::xlsx_convert(Context);
}
void form_fixed_text::serialize_control_props(std::wostream & strm)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"formControlPr")
{
CP_XML_ATTR(L"xmlns", L"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
CP_XML_ATTR(L"objectType", L"EditBox");
CP_XML_ATTR(L"dx", L"20");
CP_XML_ATTR(L"noThreeD", L"1");
if (value_)
CP_XML_ATTR(L"val", *value_);
}
}
}
void form_fixed_text::docx_convert_sdt(oox::docx_conversion_context & Context, draw_control *draw)
{
if (!draw) return;
Context.output_stream() << L"<w:sdt>";
Context.output_stream() << L"<w:sdtPr>";
{
if (name_)
{
Context.output_stream() << L"<w:alias w:val=\"" + xml::utils::replace_text_to_xml(*name_) + L"\"/>";
}
Context.output_stream() << L"<w:id w:val=\"" + std::to_wstring(Context.get_drawing_context().get_current_shape_id()) + L"\"/>";
//<w:lock w:val="sdtLocked"/>
//<w:placeholder>
// <w:docPart w:val="DefaultPlaceholder_-1854013440"/>
//</w:placeholder>
}
Context.output_stream() << L"</w:sdtPr>";
Context.output_stream() << L"<w:sdtContent>";
{
Context.add_new_run(L"");
if (current_value_)
{
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
Context.output_stream() << xml::utils::replace_text_to_xml(*current_value_ );
Context.output_stream() << L"</w:t>";
}
Context.finish_run();
}
Context.output_stream() << L"</w:sdtContent>";
Context.output_stream() << L"</w:sdt>";
}
void form_fixed_text::docx_convert_field(oox::docx_conversion_context & Context, draw_control *draw)
{
if (!draw) return;
XmlUtils::replace_all( *name_, L" ", L"_");
Context.add_new_run(L"");
Context.output_stream() << L"<w:fldChar w:fldCharType=\"begin\"><w:ffData><w:name w:val=\"" << *name_ << L"\"/><w:enabled/>";
Context.output_stream() << L"</w:ffData></w:fldChar>";
Context.finish_run();
Context.add_new_run(L"");
Context.output_stream() << L"<w:instrText>FORMTEXT</w:instrText>";
Context.finish_run();
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>";
Context.add_new_run(L"");
Context.output_stream() << L"<w:t>" << *current_value_ << L"</w:t>";
Context.finish_run();
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
}
// form:checkbox
//----------------------------------------------------------------------------------
const wchar_t * form_checkbox::ns = L"form";
@ -404,6 +533,8 @@ const wchar_t * form_checkbox::name = L"checkbox";
void form_checkbox::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = OBJ_CheckBox;
_CP_OPT(std::wstring) strVal;
CP_APPLY_ATTR(L"form:current-state", strVal);
@ -515,6 +646,7 @@ const wchar_t * form_combobox::name = L"combobox";
void form_combobox::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = OBJ_DropdownList;
form_element::add_attributes(Attributes);
CP_APPLY_ATTR(L"form:source-cell-range", source_cell_range_);
@ -560,7 +692,7 @@ void form_combobox::serialize_control_props(std::wostream & strm)
if (linked_cell_)
{
std::wstring fmla = converter.convert_named_expr(*linked_cell_);
std::wstring fmla = converter.convert_named_ref(*linked_cell_);
CP_XML_ATTR(L"fmlaLink", fmla);
}
if (source_cell_range_)
@ -628,9 +760,6 @@ void form_combobox::docx_convert_sdt(oox::docx_conversion_context & Context, dra
Context.finish_run();
}
}
// form:listbox
//----------------------------------------------------------------------------------
const wchar_t * form_listbox::ns = L"form";
@ -638,6 +767,7 @@ const wchar_t * form_listbox::name = L"listbox";
void form_listbox::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = OBJ_List;
form_element::add_attributes(Attributes);
CP_APPLY_ATTR(L"form:source-cell-range", source_cell_range_);
@ -678,7 +808,7 @@ void form_listbox::serialize_control_props(std::wostream & strm)
if (linked_cell_)
{
std::wstring fmla = converter.convert_named_expr(*linked_cell_);
std::wstring fmla = converter.convert_named_ref(*linked_cell_);
CP_XML_ATTR(L"fmlaLink", fmla);
}
if (source_cell_range_)
@ -693,13 +823,14 @@ void form_listbox::serialize_control_props(std::wostream & strm)
}
}
}
// form:button
// form:date
//----------------------------------------------------------------------------------
const wchar_t * form_date::ns = L"form";
const wchar_t * form_date::name = L"date";
void form_date::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = 15;
form_element::add_attributes(Attributes);
}
void form_date::docx_convert(oox::docx_conversion_context & Context)
@ -767,6 +898,175 @@ void form_date::docx_convert_sdt(oox::docx_conversion_context & Context, draw_co
Context.finish_run();
}
}
// form:time
//----------------------------------------------------------------------------------
const wchar_t * form_time::ns = L"form";
const wchar_t * form_time::name = L"time";
void form_time::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = 16;
form_element::add_attributes(Attributes);
}
void form_time::docx_convert(oox::docx_conversion_context & Context)
{
Context.get_forms_context().start_element(6);
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::docx_convert(Context);
}
void form_time::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_forms_context().start_element(6);
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::xlsx_convert(Context);
}
void form_time::serialize_control_props(std::wostream & strm)
{
}
void form_time::docx_convert_sdt(oox::docx_conversion_context & Context, draw_control *draw)
{
Context.finish_run();
Context.output_stream() << L"<w:sdt>";
Context.output_stream() << L"<w:sdtPr>";
{
if (name_)
{
Context.output_stream() << L"<w:alias w:val=\"" + xml::utils::replace_text_to_xml(*name_) + L"\"/>";
}
Context.output_stream() << L"<w:id w:val=\"" + std::to_wstring(Context.get_drawing_context().get_current_shape_id()) + L"\"/>";
Context.output_stream() << L"<w:date>";
Context.output_stream() << L"<w:dateFormat w:val=\"\"/>";
Context.output_stream() << L"<w:lid w:val=\"en-US\"/>";
Context.output_stream() << L"<w:storeMappedDataAs w:val=\"dateTime\"/>";
Context.output_stream() << L"<w:calendar w:val=\"gregorian\"/>";
Context.output_stream() << L"</w:date>";
}
Context.output_stream() << L"</w:sdtPr>";
Context.output_stream() << L"<w:sdtContent>";
{
Context.add_new_run(L"");
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
if (current_value_)
{
Context.output_stream() << xml::utils::replace_text_to_xml(*current_value_ );
}
else
{
Context.output_stream() << L"[Insert time]";
}
Context.output_stream() << L"</w:t>";
Context.finish_run();
}
Context.output_stream() << L"</w:sdtContent>";
Context.output_stream() << L"</w:sdt>";
if (label_)
{
Context.add_new_run(L"");
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
Context.output_stream() << xml::utils::replace_text_to_xml(*label_ );
Context.output_stream() << L"</w:t>";
Context.finish_run();
}
}
// form:listbox
//----------------------------------------------------------------------------------
const wchar_t * form_value_range::ns = L"form";
const wchar_t * form_value_range::name = L"value-range";
void form_value_range::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
object_type_ = OBJ_Scrollbar;
form_element::add_attributes(Attributes);
CP_APPLY_ATTR(L"form:min-value", min_value_);
CP_APPLY_ATTR(L"form:max-value", max_value_);
CP_APPLY_ATTR(L"form:step-size", step_size_);
CP_APPLY_ATTR(L"form:page-step-size", page_step_size_);
CP_APPLY_ATTR(L"form:orientation", orientation_);
CP_APPLY_ATTR(L"form:delay-for-repeat", delay_for_repeat_);
if (control_implementation_)
{
if (control_implementation_->find(L"SpinButton") != std::wstring::npos)
{
object_type_ = OBJ_SpinControl;
if (!orientation_) orientation_ = L"vertical";
}
else
{
object_type_ = OBJ_Scrollbar;
if (!orientation_) orientation_ = L"horizontal";
}
}
}
void form_value_range::docx_convert(oox::docx_conversion_context & Context)
{
if (!control_implementation_) return;
if (control_implementation_->find(L"SpinButton") != std::wstring::npos)
Context.get_forms_context().start_element(7); //spin
else
Context.get_forms_context().start_element(8); //scroll
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::docx_convert(Context);
}
void form_value_range::xlsx_convert(oox::xlsx_conversion_context & Context)
{
if (!control_implementation_) return;
if (control_implementation_->find(L"SpinButton") != std::wstring::npos)
Context.get_forms_context().start_element(7); //spin
else
Context.get_forms_context().start_element(8); //scroll
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::xlsx_convert(Context);
}
void form_value_range::serialize_control_props(std::wostream & strm)
{
if (!control_implementation_) return;
formulasconvert::odf2oox_converter converter;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"formControlPr")
{
CP_XML_ATTR(L"xmlns", L"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
CP_XML_ATTR(L"objectType", object_type_ == OBJ_SpinControl ? L"Spin" : L"Scroll");
CP_XML_ATTR(L"noThreeD", L"1");
if (linked_cell_)
{
std::wstring fmla = converter.convert_named_ref(*linked_cell_);
CP_XML_ATTR(L"fmlaLink", fmla);
}
if (value_) CP_XML_ATTR(L"val", *value_);
if (min_value_) CP_XML_ATTR(L"min", *min_value_);
if (max_value_) CP_XML_ATTR(L"max", *max_value_);
if (step_size_) CP_XML_ATTR(L"inc", *step_size_);
if (page_step_size_)CP_XML_ATTR(L"page",*page_step_size_);
if (orientation_)
{
if (*orientation_ == L"horizontal")
CP_XML_ATTR(L"horiz", 1);
else
CP_XML_ATTR(L"verticalBar", 1);
}
}
}
}
// form:item
//----------------------------------------------------------------------------------
const wchar_t * form_item::ns = L"form";

View File

@ -218,7 +218,7 @@ public:
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormElement;
form_element() {}
form_element() : object_type_(0) {}
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
@ -253,6 +253,9 @@ public:
_CP_OPT(std::wstring) xforms_bind_;
_CP_OPT(std::wstring) current_value_;
_CP_OPT(odf_types::Bool) dropdown_;
//----------------------------------------------------------------------------------------------
int object_type_;
};
// form:button
@ -320,6 +323,43 @@ public:
};
CP_REGISTER_OFFICE_ELEMENT2(form_text);
// form:fixed-text
class form_fixed_text : public form_element
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormFixedText;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context){}
virtual void docx_convert_sdt (oox::docx_conversion_context & Context, draw_control* draw);
virtual void docx_convert_field (oox::docx_conversion_context & Context, draw_control* draw);
virtual void serialize_control_props(std::wostream & strm);
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
};
CP_REGISTER_OFFICE_ELEMENT2(form_fixed_text);
// form:textarea
class form_textarea : public form_text
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormTextarea;
CPDOCCORE_DEFINE_VISITABLE();
};
CP_REGISTER_OFFICE_ELEMENT2(form_textarea);
// form:checkbox
class form_checkbox : public form_text
{
@ -352,6 +392,38 @@ public:
};
CP_REGISTER_OFFICE_ELEMENT2(form_checkbox);
// form:value-range
class form_value_range : public form_element
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormValueRange;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context){}
virtual void docx_convert_sdt (oox::docx_conversion_context & Context, draw_control *draw){}
virtual void docx_convert_field (oox::docx_conversion_context & Context, draw_control* draw){}
virtual void serialize_control_props(std::wostream & strm);
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
_CP_OPT(int) min_value_;
_CP_OPT(int) max_value_;
_CP_OPT(int) step_size_;
_CP_OPT(int) page_step_size_;
_CP_OPT(std::wstring) orientation_;
_CP_OPT(std::wstring) delay_for_repeat_;
};
CP_REGISTER_OFFICE_ELEMENT2(form_value_range);
// form:combobox
class form_combobox : public form_text
{
@ -442,10 +514,34 @@ private:
public:
};
CP_REGISTER_OFFICE_ELEMENT2(form_date);
// form:time
class form_time : public form_element
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormTime;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context){}
virtual void docx_convert_sdt (oox::docx_conversion_context & Context, draw_control* draw);
virtual void serialize_control_props(std::wostream & strm);
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
};
CP_REGISTER_OFFICE_ELEMENT2(form_time);
// form:item
class form_item : public office_element_impl<form_item>
{
@ -470,7 +566,6 @@ CP_REGISTER_OFFICE_ELEMENT2(form_item);
}
//<form:connection-resource>7.6.2,
//<form:file> 13.5.5,
//<form:fixed-text> 13.5.10,
//<form:form> 13.3,
//<form:formatted-text> 13.5.6,
//<form:frame> 13.5.19,
@ -481,7 +576,3 @@ CP_REGISTER_OFFICE_ELEMENT2(form_item);
//<form:image-frame> 13.5.20,
//<form:number> 13.5.7,
//<form:password> 13.5.4,
//<form:radio> 13.5.18,
//<form:textarea> 13.5.3,
//<form:time>
//<form:value-range> 13.5.24 and

View File

@ -57,9 +57,6 @@ void office_scripts::add_child_element( xml::sax * Reader, const std::wstring &
CP_NOT_APPLICABLE_ELM();
}
void office_scripts::add_text(const std::wstring & Text)
{
}
// office:script
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -76,9 +73,5 @@ void office_script::add_child_element( xml::sax * Reader, const std::wstring & N
CP_CREATE_ELEMENT(content_);
}
void office_script::add_text(const std::wstring & Text)
{
}
}
}

View File

@ -55,7 +55,6 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
private:
office_element_ptr_array content_;
@ -79,7 +78,6 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
private:
std::wstring script_language_;

View File

@ -125,6 +125,15 @@ std::wostream & text::text_to_stream(std::wostream & _Wostream, bool bXmlEncode)
_Wostream << (bXmlEncode ? xml::utils::replace_text_to_xml( text_, true ) : text_);
return _Wostream;
}
void text::add_space(const std::wstring & Text)
{
text_.reserve(Text.length());
for (size_t i =0; i < Text.length(); i++)
{
if (Text[i] < 0x20) continue;
text_ += Text[i];
}
}
void text::add_text(const std::wstring & Text)
{
@ -307,7 +316,7 @@ void line_break::docx_convert(oox::docx_conversion_context & Context)
Context.finish_run();
Context.finish_paragraph();
Context.start_paragraph();
Context.process_paragraph_style(Context.get_current_paragraph_style());
}
else
{
@ -498,7 +507,11 @@ void span::add_text(const std::wstring & Text)
office_element_ptr elm = text::create(Text);
content_.push_back( elm );
}
void span::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text);
content_.push_back( elm );
}
void span::docx_convert(oox::docx_conversion_context & Context)
{
bool addNewRun = false;
@ -603,7 +616,11 @@ void a::add_text(const std::wstring & Text)
office_element_ptr elm = text::create(Text) ;
content_.push_back( elm );
}
void a::add_space(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text);
content_.push_back( elm );
}
void a::docx_convert(oox::docx_conversion_context & Context)
{
bool pushed_style = false;
@ -742,10 +759,6 @@ void note::add_child_element( xml::sax * Reader, const std::wstring & Ns, const
else
CP_NOT_APPLICABLE_ELM();
}
void note::add_text(const std::wstring & Text)
{
}
void note::pptx_convert(oox::pptx_conversion_context & Context)
{
//см presentation:notes
@ -835,12 +848,6 @@ void ruby::add_child_element( xml::sax * Reader, const std::wstring & Ns, const
else
CP_NOT_APPLICABLE_ELM();
}
void ruby::add_text(const std::wstring & Text)
{
}
// text:title
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * title::ns = L"text";

View File

@ -93,7 +93,7 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ) {}
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
virtual void add_text(const std::wstring & Text);
virtual void add_space(const std::wstring & Text);
};
//-------------------------------------------------------------------------------------------------------------------
@ -276,7 +276,6 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
virtual void add_text(const std::wstring & Text);
};
CP_REGISTER_OFFICE_ELEMENT2(bookmark_ref);
//-------------------------------------------------------------------------------------------------------------------
@ -299,7 +298,6 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
virtual void add_text(const std::wstring & Text);
};
CP_REGISTER_OFFICE_ELEMENT2(reference_ref);
//-------------------------------------------------------------------------------------------------------------------
@ -395,6 +393,7 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_space(const std::wstring & Text);
};
CP_REGISTER_OFFICE_ELEMENT2(span);
@ -422,8 +421,9 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_space(const std::wstring & Text);
odf_types::common_xlink_attlist xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
std::wstring office_name_;
_CP_OPT(odf_types::target_frame_name) office_target_frame_name_;
@ -456,7 +456,6 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
std::wstring text_id_;
odf_types::noteclass text_note_class_;
@ -482,7 +481,6 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
std::wstring text_style_name_;
office_element_ptr text_ruby_base_;

View File

@ -73,12 +73,6 @@ void style_tab_stop::add_attributes( const xml::attributes_wc_ptr & Attributes )
}
void style_tab_stop::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{}
void style_tab_stop::add_text(const std::wstring & Text)
{}
// style:tab-stop
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * style_tab_stops::ns = L"style";
@ -117,12 +111,6 @@ void style_drop_cap::add_attributes( const xml::attributes_wc_ptr & Attributes )
CP_APPLY_ATTR(L"style:style-name", style_style_name_);
}
void style_drop_cap::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{}
void style_drop_cap::add_text(const std::wstring & Text)
{}
// style-background-image
// style:background-image
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -158,9 +146,6 @@ void style_background_image::add_child_element( xml::sax * Reader, const std::ws
}
}
void style_background_image::add_text(const std::wstring & Text)
{}
//////////////////////////////////////////////////////////////////////////////////////////////////
void paragraph_format_properties::add_attributes( const xml::attributes_wc_ptr & Attributes )

View File

@ -95,8 +95,7 @@ public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
public:
odf_types::length style_position_;
@ -136,6 +135,7 @@ private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ){}
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
};
@ -160,8 +160,7 @@ public:
_CP_OPT(std::wstring) style_style_name_;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
_CP_OPT(odf_types::common_xlink_attlist) xlink_attlist_;
@ -183,8 +182,7 @@ public:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
_CP_OPT(odf_types::style_repeat) style_repeat_;
_CP_OPT(odf_types::style_position) style_position_;
_CP_OPT(std::wstring) filter_name_;

View File

@ -1204,7 +1204,10 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context &
double fontSizeVal = (fo_font_size_) ? process_font_size_impl(fo_font_size_, Context.get_styles_context().get_current_processed_style()) :
process_font_size_impl(font_size(percent(100.0)), Context.get_styles_context().get_current_processed_style());
if (style_text_position_->get_type() == text_position::Percent)
if (fontSizeVal <= 0)
fontSizeVal = Context.get_current_fontSize();
if (style_text_position_->get_type() == text_position::Percent)
{
const double mul = style_text_position_->get_position().get_value() / 100.0;
if (fontSizeVal > 0)

View File

@ -90,11 +90,9 @@ public:
int process_font_size (const _CP_OPT(odf_types::font_size) & FontSize, const style_instance * currnetStyle, bool Complex = false, double Mul = 1.0);
private:
static double process_font_size_impl (const _CP_OPT(odf_types::font_size) & FontSize, const style_instance * currnetStyle, bool Complex = false, double Mul = 1.0);
static int process_font_weight (const _CP_OPT(odf_types::font_weight) & FontWeight);
static int process_font_style (const _CP_OPT(odf_types::font_style) & FontStyle);
public:
_CP_OPT(std::wstring) r_style_;
_CP_OPT(odf_types::font_variant) fo_font_variant_;

View File

@ -311,10 +311,6 @@ void default_style::add_child_element( xml::sax * Reader, const std::wstring & N
content_.add_child_element(Reader, Ns, Name, getContext());
}
void default_style::add_text(const std::wstring & Text)
{
}
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * draw_fill_image::ns = L"draw";
const wchar_t * draw_fill_image::name = L"fill-image";
@ -478,10 +474,6 @@ void style::add_child_element( xml::sax * Reader, const std::wstring & Ns, const
content_.add_child_element(Reader, Ns, Name, getContext());
}
void style::add_text(const std::wstring & Text)
{
}
// styles & draw_styles
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -579,9 +571,6 @@ void office_automatic_styles::add_child_element( xml::sax * Reader, const std::w
}
}
void office_automatic_styles::add_text(const std::wstring & Text)
{}
// office:master-styles
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * office_master_styles::ns = L"office";
@ -610,11 +599,6 @@ void office_master_styles::add_child_element( xml::sax * Reader, const std::wstr
}
}
void office_master_styles::add_text(const std::wstring & Text)
{
}
// office:styles
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * office_styles::ns = L"office";
@ -1388,7 +1372,7 @@ void style_page_layout_properties::xlsx_serialize(std::wostream & strm, oox::xls
std::wstring href = fill.bitmap->xlink_href_;
fill.bitmap->rId = Context.get_mediaitems()->add_or_find(href, oox::typeImage, fill.bitmap->isInternal, href);
Context.get_drawing_context().get_drawings()->add(fill.bitmap->isInternal, fill.bitmap->rId, href, oox::typeImage, true);
Context.get_drawing_context().get_drawings()->add(fill.bitmap->isInternal, fill.bitmap->rId, href, oox::typeImage, true, false);
}
Context.get_table_context().state()->set_background(fill.bitmap->rId);
@ -1777,10 +1761,6 @@ void text_notes_configuration::add_child_element( xml::sax * Reader, const std::
CP_NOT_APPLICABLE_ELM();
}
void text_notes_configuration::add_text(const std::wstring & Text)
{
}
/// style:presentation-page-layout
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * style_presentation_page_layout::ns = L"style";

Some files were not shown because too many files have changed in this diff Show More