Compare commits

..

336 Commits

Author SHA1 Message Date
51c1b7d21a Fix common apps (#224) 2020-02-27 15:09:14 +03:00
4b0ce196e8 [x2t] Fxi bug 44611 (#223) 2020-02-25 22:53:48 +03:00
b96189c213 [android][xt2] Fix overwrite document 2020-02-21 11:45:11 +03:00
987e6b6e76 [android][xt2] Open password odf document 2020-02-21 11:45:11 +03:00
aefef93e21 icu for ios (#221)
Co-authored-by: Alexey.Musinov <alexey.musinov@gmail.com>
2020-02-19 19:05:23 +03:00
2c04e9fb57 Fix windows flags (#220) 2020-02-13 19:41:15 +03:00
e6007815a2 [x2t] Fix bug 44466 (#219)
Move m_oFirstLine, m_oHanging from CTwipsMeasure(unsigned) to CSignedTwipsMeasure
2020-02-07 18:39:20 +03:00
56482f0524 Feature/build ios (#218)
* Fix build on ios in debug mode

* Fix ios build
2020-01-28 14:19:20 +03:00
b901073171 Remove travis build (#216)
This speed up PR process (requested by @K0R0L)
This build is deprecated, since build of project is moved
to another tool - `build_tool` since v5.5.0
And this config is never worked
See:
https://github.com/ONLYOFFICE/core/pull/29#issuecomment-306773327
2020-01-20 14:39:07 +03:00
03404d74a4 Merge pull request #215 from ONLYOFFICE/feature/fixBoost
Feature/fix boost
2020-01-20 14:21:13 +03:00
2154cb1dba Update boost build script for ios 2020-01-20 13:58:57 +03:00
f3fb3f7ca7 Fix build 2020-01-20 12:07:31 +03:00
20090072ae Add new method (#214) 2020-01-16 18:17:27 +03:00
bd85ec1b10 Add functionality to base.pri (#212) 2020-01-15 16:55:09 +03:00
cee502b855 Add CopyDirectory method (#210) 2020-01-15 15:45:18 +03:00
524eac388e [x2t] For bug 38945 (#209)
For comments without author
2020-01-14 16:12:55 +03:00
0daaf560ae [x2t] For bug 44039 (#208)
Abs negative comment coordinates and offset as Excel does
2020-01-09 17:01:20 +03:00
e7c87085a7 Fix metafile to raster sizes (#207) 2020-01-09 15:37:39 +03:00
39ddc7582f Add Events to FileDownloader
OnComplete: worked
OnProgress: not implemented
2019-12-26 17:40:17 +03:00
6225da01dc [x2t] Fix bug 43709 2019-12-26 13:58:30 +03:00
9f5b114106 PptFormat - fix bug #43994 2019-12-25 18:31:57 +03:00
e91718f11b . 2019-12-22 15:16:29 +03:00
aacc6faf88 [x2t] Replace some AVS_FILEUTILS_ERROR_CONVERT errors with AVS_FILEUTILS_ERROR_CONVERT_PARAMS 2019-12-20 19:18:00 +03:00
442413f4a8 Fixed gitignore for build_tools 2019-12-20 13:23:07 +03:00
4f69be6dc5 [x2t] Fix crash in case of incorrect m_oInputLimit.template; Allow multiple m_oInputLimit 2019-12-19 11:34:50 +03:00
6522ded7d9 [android][x2t] add state 2019-12-18 17:27:50 +03:00
68f2c3f6eb . 2019-12-16 19:23:04 +03:00
6a8d109a47 x2t - from binary to docx for libreoffice 2019-12-16 18:12:07 +03:00
0ffe61b2fc . 2019-12-16 17:30:47 +03:00
f38e31a081 . 2019-12-16 15:47:29 +03:00
9a925ffa1b Merge branch 'feature/dylibs' into develop
* feature/dylibs:
  [ios] rmeove unsused project
2019-12-16 11:14:00 +03:00
f47b968000 Add support custom version & icon for branding docbuilder 2019-12-14 16:23:50 +03:00
1dfef1f347 Refactoring 2019-12-14 15:55:02 +03:00
f774f78a8d Fix build on xp 2019-12-14 12:53:16 +03:00
699e533fff Revert last commit 2019-12-13 18:52:06 +03:00
88fcbcee28 . 2019-12-13 16:27:30 +03:00
f754f81e6b [x2t] Fix CConditionalFormatValueObject::toXML2 2019-12-10 18:37:27 +03:00
19ae5946b9 [x2t] Remove undocumented param m_nDoctParams and doct xml param OnlyOnePage 2019-12-10 15:33:41 +03:00
3b8959b8a3 Switch doctrenderer param to json 2019-12-09 19:15:10 +03:00
0b651a95bc Switch doctrenderer param to json 2019-12-09 18:11:32 +03:00
43ce595c92 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-12-09 15:28:39 +03:00
9ba07b30f0 . 2019-12-09 15:22:50 +03:00
4c956f9a91 Move custom plist to build_tools 2019-12-08 23:12:13 +03:00
ca5307dd5d Switch to python version 2019-12-08 15:24:16 +03:00
ca348a9ea9 Fix update script 2019-12-08 13:50:25 +03:00
e94dfb53b0 Add support custom plist 2019-12-06 17:52:30 +03:00
b4d1b414ee Use custom plist 2019-12-06 17:40:02 +03:00
19ec211697 DocFormat - used user lcid 2019-12-06 17:39:03 +03:00
384d51318c RtfFormat - used user lcid 2019-12-06 17:14:54 +03:00
5a00bfb7b8 XlsFormat - used user lcid 2019-12-06 16:43:42 +03:00
453b3dc2b6 Remove StandardTester from git 2019-12-06 15:38:32 +03:00
6d70e67649 StandardTester new scheme 2019-12-06 15:12:28 +03:00
1e8b88b032 Fix bugs with standardtester 2019-12-06 14:30:41 +03:00
2f078de341 Fix bugs frameworks build 2019-12-06 11:39:55 +03:00
ec7d1efc93 . 2019-12-05 19:59:19 +03:00
ea99cf21b4 [x2t] Add m_nLcid option 2019-12-05 19:01:58 +03:00
0b8b524ebc . 2019-12-05 18:52:07 +03:00
1097518927 Fix bugs 2019-12-05 18:19:16 +03:00
26a9eda4ea Add frameworks build support 2019-12-05 18:15:23 +03:00
3012252048 Build on XP 2019-12-05 17:03:23 +03:00
f3fd70a895 bundle_dylibs support 2019-12-05 16:25:26 +03:00
998742d331 XlsFormat - fix after testing 2019-12-05 15:20:42 +03:00
0e9f4386cc [x2t] Fix bug 43375 2019-12-05 14:29:23 +03:00
0b518d2272 Deploy core archive from 'build_tools' dir 2019-12-04 19:36:34 +03:00
44b4a808c4 Change destination folder for standardtester 2019-12-04 16:29:53 +03:00
3e6c04fdf2 Fix build 2019-12-04 15:51:41 +03:00
f2c4f429b7 XlsFormat - fix bug #43746 2019-12-03 18:43:09 +03:00
2565ccacd7 OdfFormatWriter - fix after testing 2019-12-03 16:50:04 +03:00
f914bc03ea Add full bitcode support on ios 2019-12-03 11:35:45 +03:00
06b73865b8 . 2019-12-02 16:49:42 +03:00
3e651985c1 DocFormatReader - fix bug #43676 2019-12-02 12:16:12 +03:00
9ead37d43f Add support new build_tools 2019-11-29 18:30:31 +03:00
26b1b5acf0 Update boost.pri 2019-11-29 18:27:03 +03:00
194cd7b9dd Change icu.pri file 2019-11-29 16:43:30 +03:00
1724504378 XlsFormat - fix after testing 2019-11-27 19:31:11 +03:00
9b75205de1 Fix compile with no_dylibs flag 2019-11-27 17:47:07 +03:00
4b78d15845 Add support disabling dynamic libraries 2019-11-27 16:27:36 +03:00
fd1bc80682 OdfFormatReader - fix bug #43643 2019-11-26 19:27:41 +03:00
723c0f9f34 [x2t] Add editAs(xdr:twoCellAnchor) to Editor.bin 2019-11-26 15:27:06 +03:00
86fd036bad Correct build paths 2019-11-26 14:53:02 +03:00
932ec85676 [ios][x2t] Fixed path to sources of Pivot 2019-11-25 10:00:06 +03:00
84919a9a02 [ios][x2t] update settings 2019-11-22 19:36:46 +03:00
bd702e9c61 XlsFormat - fix after testing 2019-11-22 19:34:51 +03:00
5d7348ac8a [ios] rmeove unsused project 2019-11-22 13:04:04 +03:00
a547fa8ad1 . 2019-11-21 19:34:04 +03:00
30424c3c1f Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-11-21 19:00:10 +03:00
4e3dda042d . 2019-11-21 18:59:27 +03:00
40009363ee [x2t] Add m_sJsonParams option 2019-11-21 18:57:18 +03:00
70ccf677c3 Add embed-bitcode flag 2019-11-21 13:00:00 +03:00
50032f2fbf [x2t] For w14:checkbox 2019-11-20 15:07:42 +03:00
04c0030a85 OdfFormatReader - fix bug #43578 2019-11-20 14:06:45 +03:00
95a8c7870b OdfFormatReader - fix bug #43577 2019-11-19 19:47:03 +03:00
b58194b5b4 . 2019-11-15 14:53:13 +03:00
be35df9b5c . 2019-11-14 14:40:13 +03:00
b638f6336a . 2019-11-14 14:36:44 +03:00
79cfaed6a8 . 2019-11-14 13:53:33 +03:00
f677bf91e9 XlsFormat - fix after testing 2019-11-14 12:17:43 +03:00
3f5bc0f444 [ios][se] add clear curr font 2019-11-14 11:45:44 +03:00
c2cd9b7b87 [android][x2t] fix gradle script 2019-11-13 13:23:51 +03:00
68ad5e9515 XlsFormat - fix after testing 2019-11-12 17:31:56 +03:00
d808689cb3 x2t - for bug #40375. 2019-11-12 14:21:53 +03:00
f736a6e5fa [android][x2t] fix module script 2019-11-08 16:40:54 +03:00
460b087b1f [android][x2t] fix module script 2019-11-08 16:27:41 +03:00
447b590365 [android][x2t] fix build 2019-11-08 11:15:00 +03:00
af50daa022 XlsFormat - fix after testing 2019-11-07 19:30:54 +03:00
89df29b945 OdfFormatReader - fix comment range 2019-11-06 16:49:45 +03:00
b5b35f1d3d OdfFormatWriter - for bug #42982 2019-11-06 13:27:23 +03:00
b48406c941 OdfFormat - fix bug #43418, fix bug #42098 2019-11-05 19:21:34 +03:00
47826b7e23 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-11-01 14:43:00 +03:00
b9865d09c7 OdfFormatReader - fix bug #43420 2019-11-01 14:41:54 +03:00
d4577a487e Full support comparing files 2019-11-01 14:17:57 +03:00
36332af06e . 2019-10-31 18:32:17 +03:00
8c93208255 Merge remote-tracking branch 'origin/develop' into develop 2019-10-31 17:38:25 +03:00
7d45cfaf45 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-10-31 16:15:21 +03:00
858def093f developing... 2019-10-31 16:14:33 +03:00
be04366d4c [x2t] Fix bug 43423 2019-10-31 16:05:07 +03:00
8ab28c7ad3 [android][x2t] fix module dependency 2019-10-31 12:37:38 +03:00
1bc6615534 [android][x2t] fix dependency version 2019-10-29 19:30:11 +03:00
6d46824387 [android][x2t] fix lib path 2019-10-29 18:00:28 +03:00
84a9194649 [android][x2t] fix lib names 2019-10-29 17:51:10 +03:00
f8c7bda679 [android][x2t] fix relative paths for windows 2019-10-29 16:41:31 +03:00
ea6f776dcb [ios][documents] fix build 2019-10-29 16:07:35 +03:00
9254479612 [android][x2t] fix relative paths 2019-10-29 15:55:05 +03:00
4f01ab3f7a [android][x2t] update x2t gui test app for x2t library 2019-10-29 15:45:12 +03:00
e2d2e2a7f2 [android][x2t] add module relative path 2019-10-29 15:45:12 +03:00
32909effd9 OdfFormatWriter - fix bug #43390 2019-10-29 14:56:33 +03:00
354a02b94c OdfFormat - fix bug #42098 2019-10-29 14:09:18 +03:00
195520d21c [android][x2t] add project for build library 2019-10-29 13:52:59 +03:00
3d2069592c [android][x2t] add project for build library 2019-10-29 13:15:01 +03:00
368ccff384 OdfFormat - fix bug #43369 2019-10-28 16:48:36 +03:00
6774ab10f5 [x2t] For pdf->pdf\a convertion 2019-10-25 20:08:28 +03:00
d3110f5c43 refactoring 2019-10-25 10:45:01 +03:00
015146a927 Inject builderJS object 2019-10-24 19:14:40 +03:00
ecbfefeb5c OdfFormatReader - fix bug #43347 2019-10-24 18:42:28 +03:00
57d0475281 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-10-24 17:09:38 +03:00
88aa8a4c54 x2t - fix bug #38594 2019-10-24 17:06:07 +03:00
56348548be fix previous merge 2019-10-24 16:42:36 +03:00
b21ff58336 Merge pull request #205 from alexandervnuchkov/patch-4
Update Readme.md
2019-10-24 15:15:27 +03:00
baaa6ed85b Update Readme.md 2019-10-24 12:35:59 +03:00
8f3ae7e04b Update build.sh [boost] 2019-10-24 10:36:35 +03:00
542d000435 Merge remote-tracking branch 'origin/feature/mobileIOS' into develop
# Conflicts:
#	DesktopEditor/doctrenderer/doctrenderer.pro
2019-10-24 10:24:53 +03:00
9edd45f1bb builderJS funcs 2019-10-23 18:53:46 +03:00
d9eb4f2cdc Refactoring (override GetTempPath) 2019-10-23 18:29:57 +03:00
590da3344b . 2019-10-23 14:43:46 +03:00
81a50062b1 [x2t] Fix bug 43301 2019-10-23 11:43:44 +03:00
c204d77b0d [x2t] Fix bug 43290 2019-10-22 19:41:02 +03:00
c6750bb7bc developing... 2019-10-22 17:58:03 +03:00
53d4825b13 . 2019-10-22 17:26:58 +03:00
0be8ff94a1 . 2019-10-22 15:12:54 +03:00
7d7d60bf08 test for ios x2t 2019-10-21 22:56:24 +03:00
c5c1911791 .
XlsFormat - fix after testing
2019-10-21 18:36:18 +03:00
0fb95e259c developing... 2019-10-21 17:34:10 +03:00
5db9ebe93a developing... 2019-10-21 11:15:13 +03:00
39ed75c19c developing... 2019-10-21 09:55:53 +03:00
5b9688e087 developing... 2019-10-20 00:07:19 +03:00
bd92dcf80b UnicodeConverter refactoring 2019-10-19 13:22:40 +03:00
f77dfa7825 UnicodeConverter refacoring 2019-10-19 12:55:27 +03:00
c26dc8cd78 developing... 2019-10-18 23:49:42 +03:00
c7308f4211 developing... 2019-10-18 23:49:21 +03:00
cbb2628856 . 2019-10-18 15:29:08 +03:00
ae90c75b78 developing... 2019-10-17 19:46:07 +03:00
5be7ca2bc5 developing... 2019-10-17 19:35:21 +03:00
79bccd5002 . 2019-10-17 14:31:46 +03:00
254db1fc2c Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-10-16 18:38:58 +03:00
d6735d1fb5 XlsFormat - fix after testing 2019-10-16 18:37:58 +03:00
9b3944a017 QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.11 2019-10-16 17:54:09 +03:00
6ebeaae305 Merge pull request #203 from ONLYOFFICE/hotfix/v5.4.2
Hotfix/v5.4.2
2019-10-16 14:08:44 +03:00
8cdaf43001 Feature/font bugs (#202)
* Fonts bugs

* Move fonts_check version to src file
2019-10-16 14:07:24 +03:00
ee0329cc1d . 2019-10-16 11:45:22 +03:00
52bf8581e7 XlsFormat - fix after testing 2019-10-15 18:33:28 +03:00
afc60a62a7 Fonts bugs 2019-10-15 16:46:09 +03:00
cb25a15a36 OdfFormat - fix bug #43170 2019-10-15 13:59:22 +03:00
cd0e152dbe Correct fetching boost 2019-10-15 09:53:05 +03:00
8d014ee27a refactoring 2019-10-14 19:04:55 +03:00
67a09bf28e Rename Api variable 2019-10-14 18:11:40 +03:00
9b1e705347 [x2t] Add missing from d4f2f69ed0 2019-10-14 10:31:22 +03:00
4f09747caf Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-10-12 16:31:12 +03:00
3af89f83eb XlsFormat - fix after testing 2019-10-12 16:29:30 +03:00
d4f2f69ed0 [x2t] Add SdtCheckBoxPr to Editor.bin 2019-10-11 20:14:55 +03:00
21984680ce XlsFormat - fix bug #43072 (#200) 2019-10-11 14:15:37 +03:00
6e2e23f5d0 XlsFormat - fix after testing 2019-10-11 12:30:16 +03:00
06b5f0e8b8 XlsFormat - fix bug #43133 2019-10-09 18:02:04 +03:00
484f6d2889 [android][se] fix temp path 2019-10-08 16:49:02 +03:00
1eaa656001 refactoring 2019-10-08 16:44:54 +03:00
5075d49b40 DocxFormat - for bug #43071 2019-10-07 16:52:38 +03:00
d5529f4077 Merge remote-tracking branch 'origin/develop' into develop 2019-10-07 16:04:37 +03:00
b4240ca49b [android][de & pe & se] get temp directory for Android 2019-10-07 16:00:08 +03:00
b04c6b2f87 [x2t] Add sortState.columnSort,sortMethod to Editor.bin 2019-10-07 15:30:36 +03:00
9d3b9ef021 XlsFormat - fix bug #43072 2019-10-07 14:09:09 +03:00
01577278f0 [android][de] temp directory for Android 2019-10-03 18:01:00 +03:00
f97050a685 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-10-02 15:05:05 +03:00
2715c774ed OdfFormatWriter - add pilot tables (pivot) 2019-10-02 15:04:30 +03:00
aa545edf3d [x2t] Add worksheet.sortState to Editor.bin 2019-10-02 13:46:41 +03:00
7626d6d75f v5.4.1 2019-10-02 12:07:22 +03:00
c8def9eb7b v5.4.1 2019-10-02 12:02:37 +03:00
cba74d6e8d . 2019-09-30 17:41:30 +03:00
62c9490282 DocxFormat - pivot cache 2019-09-30 16:40:19 +03:00
048318e341 Fix icu building (#198)
Change icu repos
2019-09-30 15:59:13 +03:00
0f25a738d5 Merge remote-tracking branch 'origin/hotfix/v5.4.1' into develop
# Conflicts:
#	DesktopEditor/fontengine/FontFile.h
2019-09-30 15:10:54 +03:00
0d327e7743 [ios][se] fixed build 2019-09-30 14:47:32 +03:00
49ee434202 Fix fonts bug (#196) 2019-09-30 14:39:57 +03:00
8b3f1b9d86 [x2t] Fix rtlGutter writing to Editor.bin 2019-09-30 14:17:10 +03:00
a76e93cea6 [x2t] Remove reply duplicates. Fix bug 42969 2019-09-27 12:04:56 +03:00
c26252d25f [x2t] Fix Excel recovery error; Fix bug 42968 2019-09-27 10:51:48 +03:00
2e23b79ab8 [x2t] Fix GenerateGuid. For bug 42947 2019-09-26 20:08:58 +03:00
7faa83eb8a Fix bug 42926 2019-09-26 16:17:24 +03:00
6d6d097069 Fix bug 42926 2019-09-26 15:54:55 +03:00
e9c1deaca6 fix error #42938 2019-09-24 18:56:54 +03:00
0b34858d49 fix error #42932 2019-09-24 18:56:28 +03:00
b900613df1 DocxFormat - pivot table 2019-09-21 14:58:10 +03:00
095c53a61a Merge pull request #195 from ONLYOFFICE/feature/fix_errors7_v5.4.1
RtfFormat - fix after testing
2019-09-18 12:42:49 +03:00
640b914ff8 RtfFormat - fix after testing 2019-09-18 12:40:50 +03:00
e48be100ed [x2t] Change tab type format in Editor.bin 2019-09-17 19:51:02 +03:00
429b4f1245 DocFormatReader - fix bullet picture(dib with pallete) 2019-09-17 13:08:14 +03:00
cc7dee211a Merge remote-tracking branch 'origin/hotfix/v5.4.1' into develop 2019-09-17 12:41:37 +03:00
3238d504eb Merge pull request #194 from ONLYOFFICE/feature/fix_errors6_v54.1
DocFormatReader - fix after testing
2019-09-13 17:09:26 +03:00
aeda8ec571 DocFormatReader - fix after testing 2019-09-13 17:08:12 +03:00
ec440d0bd3 [ios][x2t] fixed build 2019-09-13 16:48:44 +03:00
2d094ae872 Merge pull request #193 from ONLYOFFICE/feature/v8_7.0
.
2019-09-13 14:03:34 +03:00
839c180d8c . 2019-09-13 14:02:39 +03:00
3f55d6d4ff Merge pull request #192 from ONLYOFFICE/feature/v8_7.0
Feature/v8 7.0
2019-09-13 12:36:56 +03:00
d67a4b9f6e Merge remote-tracking branch 'remotes/origin/hotfix/v5.4.1' into develop
# Conflicts:
#	Common/DocxFormat/Source/XlsxFormat/Worksheets/DataValidation.cpp
2019-09-13 12:33:14 +03:00
eb9242cba0 developing 2019-09-13 11:55:09 +03:00
11eb11e502 developing 2019-09-12 18:39:45 +03:00
cf4451e60f [x2t] Fix table shd reading from Editor.bin 2019-09-12 15:04:05 +03:00
1e2b9dbc34 Support flv fotmat (and work v8 with newer gcc) 2019-09-12 14:11:06 +03:00
7d7b4b816f [x2t] Fix 42667
Fix typo
2019-09-11 19:32:34 +03:00
5405763b05 Merge pull request #189 from ONLYOFFICE/hotfix/v5.4.1
Hotfix/v5.4.1
2019-09-11 16:55:11 +03:00
0b468d5dd5 Support different theme thumbnails params 2019-09-11 16:38:25 +03:00
50477b5091 Merge pull request #188 from ONLYOFFICE/feature/fix_errors5_v5.4.1
x2t - fix after testing; fix error #42790
2019-09-11 15:57:19 +03:00
f53103efe0 x2t - fix after testing; fix error #42790 2019-09-11 15:56:03 +03:00
f57e9718b9 Merge pull request #187 from ONLYOFFICE/hotfix/v5.4.1
Hotfix/v5.4.1
2019-09-11 11:15:24 +03:00
a747f96a9d Fix fonts picker bugs 2019-09-09 15:05:41 +03:00
c5db9cf61f Merge pull request #186 from ONLYOFFICE/feature/bug-bookmark-writing
[x2t] Fix bookmarks saving inside hyperlink
2019-09-06 17:01:38 +03:00
c0cf748677 [x2t] Fix bookmarks saving inside hyperlink 2019-09-06 16:51:08 +03:00
148d6b01ef [x2t] Extend lvl Format in Editor.bin
(cherry picked from commit 41920875ff)
2019-09-05 13:17:09 +03:00
54dbe697f1 Merge remote-tracking branch 'origin/hotfix/v5.4.1' into develop 2019-09-05 12:55:32 +03:00
22306842d6 Merge pull request #185 from ONLYOFFICE/feature/fix_errors5_v5.4.1
x2t - fix after testing
2019-09-05 12:32:04 +03:00
e1237b99e2 x2t - fix after testing 2019-09-05 12:30:22 +03:00
66d534a415 [x2t] For c215344550. Fix memory leak 2019-09-04 10:34:33 +03:00
72467589e2 Merge pull request #184 from ONLYOFFICE/feature/fix_errors4_v5.4.1
XlsFormat - fix bug #42618, fix bug #42216
2019-09-03 18:00:39 +03:00
9739507dcd XlsFormat - fix bug #42618, fix bug #42216 2019-09-03 17:57:26 +03:00
c215344550 [x2t] Fix _xHHHH_ chars in dataValidation attributes. Fix bug 42663. 2019-09-03 17:41:04 +03:00
f849f79595 DocFormatReader - fix extended comments; fix bug #42654, fix bug #42239; OdfFormatWriter - fix error in headers/footers; fix after testing (#181)
* DocFormatReader - fix extended comments

* XlsFormatReader - fix bug #42239

* OdfFormatWriter - fix error in headers/footers

* OdfFormatWriter - fix bug #42654

* x2t - fix after testing

* .
2019-09-03 15:24:44 +03:00
4f42a2230e XlsFormatReader - fix bug #42239; OdfFormatWriter - fix error in headers/footers (#182)
* XlsFormatReader - fix bug #42239

* OdfFormatWriter - fix error in headers/footers
2019-09-03 15:24:23 +03:00
11dad1b10b v5.4.0 2019-09-03 14:37:38 +03:00
9fb9fd3511 Merge remote-tracking branch 'origin/feature/fix_errors2_v5.4.0' into develop 2019-09-03 11:52:25 +03:00
246474a2f7 Merge branch 'feature/fix_errors3_v.5.4.0' into feature/fix_errors2_v5.4.0 2019-09-03 11:47:23 +03:00
af0f878de2 [ios] refactoring 2019-09-03 10:53:09 +03:00
fc8d16196d Fixed project of OdfReaderFormat library for ios 2019-09-03 09:45:01 +03:00
41fc3eb8c1 x2t - fix after testing 2019-09-02 17:52:47 +03:00
53878c9d88 OdfFormatWriter - fix bug #42654 2019-09-02 16:00:46 +03:00
677982b4ce OdfFormatWriter - fix error in headers/footers 2019-09-02 12:58:53 +03:00
e7290f5ad9 XlsFormatReader - fix bug #42239 2019-09-02 11:43:54 +03:00
816c43bffe [android][de] fix emf 2019-09-02 08:56:17 +03:00
8dd58a2050 [android][de] fix emf 2019-08-31 11:32:27 +03:00
e96221c83b DocFormatReader - fix extended comments 2019-08-30 13:00:48 +03:00
2a4ee72059 [ios][x2t] fixed build 2019-08-29 18:14:37 +03:00
9a3e9a9851 [ios][x2t] fixed build 2019-08-29 18:07:34 +03:00
41920875ff [x2t] Extend lvl Format in Editor.bin 2019-08-29 14:18:10 +03:00
4fd933f393 [x2t] Fix crash while opening (#180) 2019-08-28 18:25:41 +03:00
1165189242 [x2t] Read empty string from empty node value. For bug 42568 (#179) 2019-08-28 16:38:27 +03:00
0ae9b97774 [ios][x2t] fixed build 2019-08-28 14:41:00 +03:00
c644c419ec Merge remote-tracking branch 'origin/release/v5.4.0' into develop 2019-08-28 13:45:01 +03:00
b6e88ce999 Fix errors1 v5.4.0 (#178)
* fix bug #42542

* OdfFormatW - fix after testing

* fix bug #42542 (file 2)

* x2t - fix users files

* DocFormatReader - fix bug #42526
2019-08-28 12:02:25 +03:00
3874b56289 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-08-27 15:24:44 +03:00
29df40407e [android][se] fix crash 2019-08-27 14:57:13 +03:00
8a7b6fbb2b Fix bug #42542 (#177) 2019-08-27 13:03:12 +03:00
e3ff8912f0 [ios][de] update file utils 2019-08-26 17:12:06 +03:00
ae6d231acc OdfFormatW - fix after testing 2019-08-26 14:31:43 +03:00
98114aa7a5 fix bug #42542 2019-08-26 13:18:55 +03:00
6bd1d9b90b v5.3.5 2019-08-26 11:25:08 +03:00
cc8cfb6124 v5.3.5 2019-08-26 11:23:38 +03:00
36aa148aa0 . 2019-08-25 17:56:08 +03:00
f69180dcf6 . 2019-08-24 18:15:26 +03:00
864c3bfdc7 Fix memory error 2019-08-23 17:02:43 +03:00
4bb34abf91 Fix bug with font picker 2019-08-23 15:27:28 +03:00
3887879671 . 2019-08-23 14:07:15 +03:00
9516a0b02b Fix previous commit 2019-08-23 13:36:11 +03:00
047041aa9b Fix previous commit 2019-08-23 13:20:25 +03:00
ca5e70118c Add family names for picker 2019-08-23 13:15:42 +03:00
99159d5932 . 2019-08-22 19:39:07 +03:00
5d89558b5d Support picker on save to pdf command 2019-08-22 15:13:31 +03:00
5058d41d6a Support picker on save to pdf command 2019-08-22 14:37:31 +03:00
69be19feda Support picker on save to pdf command 2019-08-22 13:52:19 +03:00
73933c683e . 2019-08-22 13:17:15 +03:00
55e4902d66 [android][pe] fix build 2019-08-21 15:42:08 +03:00
2dc1ad5af7 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-08-20 19:18:34 +03:00
ab0def1840 OdfFormatWriter - add spreadsheets footers & headers (fix bug #42457) 2019-08-20 19:17:45 +03:00
957972e3be Merge pull request #176 from ONLYOFFICE/feature/android_fonts
Feature/android fonts
2019-08-20 18:44:49 +03:00
49e31f2c0c Correct write font_selection.bin 2019-08-20 16:20:30 +03:00
4585e86fb7 Developing... 2019-08-20 11:41:37 +03:00
6bcafa516a Merge branch 'feature/native_nosquares' into develop
# Conflicts:
#	DesktopEditor/fontengine/FontManager.cpp
2019-08-19 16:24:19 +03:00
e41f8019d6 Fix bugs 2019-08-19 16:09:08 +03:00
e8f1da2478 Add new common methods (#173) 2019-08-19 12:05:26 +03:00
b378084925 . 2019-08-16 16:46:16 +03:00
99f47b43a5 OdfFormat - spreadsheets forms 2019-08-16 13:26:30 +03:00
dc1999482e [fonts][windows] Remove recursion for user fonts 2019-08-16 11:24:59 +03:00
7c764f5b84 Developing... 2019-08-16 11:12:40 +03:00
03316ea82d [x2t] For bug 42422 2019-08-15 17:06:42 +03:00
567f547d10 [android][se] fix crash with xls format 2019-08-15 16:35:55 +03:00
a4a52ec016 [android][pe] fix crash for empty presentation 2019-08-15 15:19:52 +03:00
1458b1c57f RtfFormat - fix users files 2019-08-14 17:57:07 +03:00
7d59211e67 Add symbol ranges detection 2019-08-14 17:54:07 +03:00
f68662827d OdfFormat - fix bug #42381 2019-08-14 15:37:03 +03:00
bd61eb4bef DocFormat - fix word95 table 2019-08-13 15:55:20 +03:00
63fabad661 .. 2019-08-13 14:01:20 +03:00
b9981cffef Fix xp build 2019-08-12 10:30:12 +03:00
30a30d1bc6 [android][pe] fix runtime crash 2019-08-09 14:57:43 +03:00
d5d086d286 . 2019-08-08 13:14:43 +03:00
6822c8b7dd x2t - fix bug #42341 2019-08-08 12:12:49 +03:00
56b7889270 Add new common methods 2019-08-07 18:50:27 +03:00
f4cdfc49bb [x2t] Fix typo 2019-08-07 17:03:29 +03:00
972f1ef4e5 [x2t] Add EffectProperties::fromPPTY; Fix EffectLst::fromPPTY 2019-08-05 18:07:56 +03:00
8fda74aefc [x2t] Fix bug 42288 2019-08-05 11:17:00 +03:00
7bba282321 [android][x2t] fix crash 2019-08-05 10:06:59 +03:00
8c8f59da80 [x2t] Add outlinePr to Editor.bin 2019-08-02 14:51:45 +03:00
3027a038d0 [x2t] Fix build 2019-08-02 11:31:43 +03:00
9c6ee2a171 [x2t] Fix NSStringExt::FindLastNotOf 2019-08-01 20:03:56 +03:00
e8d6092a95 Add return values to builder interface 2019-08-01 18:27:17 +03:00
3bc08e72dc Add return values to builder interface 2019-08-01 18:15:48 +03:00
c094962751 [x2t] Fix mailmerge 2019-07-29 16:23:48 +03:00
70f8abf0bf OdfFormat - fix users files 2019-07-29 13:38:18 +03:00
47318eef9c RtfFormatReader - fix users files 2019-07-26 17:33:24 +03:00
094a1d98d6 Add executable path to rpath 2019-07-26 16:55:00 +03:00
471219e59a [x2t] Fix dataValidations writing 2019-07-26 14:10:29 +03:00
2cfd2a0126 Change com object 2019-07-26 14:07:43 +03:00
f3ec039a01 Fix bug #42195
Fix the problem with reading EMF_BITBLT record in the EMF
2019-07-26 12:26:07 +03:00
f4795db0b8 Add allfonts path param 2019-07-26 11:30:21 +03:00
b52d9cb5d6 Correct "LoadConfig" method in doctrenderer 2019-07-25 19:00:07 +03:00
ff2303f386 . 2019-07-25 15:55:04 +03:00
d78fe3b9b1 OdfFormat 2019-07-25 14:27:48 +03:00
b589d53213 OdfFormatWriter - fix watermark position 2019-07-24 17:12:55 +03:00
fcb01e9675 RtfFormat - fix users files 2019-07-24 16:43:27 +03:00
60b41cae31 [x2t] Add w:compat to Editor.bin 2019-07-24 13:54:14 +03:00
ecca92951c OdfFormat - fix users files 2019-07-23 18:47:52 +03:00
727 changed files with 32521 additions and 18122 deletions

3
.gitignore vendored
View File

@ -5,6 +5,7 @@ Common/boost_1_58_0
Common/3dParty/boost/boost_1_58_0
Common/3dParty/boost/ios
Common/3dParty/boost/osx
Common/3dParty/icu/icu
Common/3dParty/icu/win_64
Common/3dParty/icu/win_32
Common/3dParty/icu/linux_64
@ -44,6 +45,7 @@ Common/3dParty/openssl/openssl
Thumbs.db
*.xcuserstate
*.xcuserdatad
**/Makefile.*
ASCOfficeXlsFile2/win32/_ASCOfficeXlsFile2.idl
ASCOfficeXlsFile2/win32/_ASCOfficeXlsFile2.tlb
ASCOfficeXlsFile2/win32/_ASCOfficeXlsFile2.h
@ -51,7 +53,6 @@ ASCOfficeXlsFile2/win32/_ASCOfficeXlsFile2_i.c
ASCOfficeXlsFile2/win32/_ASCOfficeXlsFile2_p.c
ASCOfficeXlsFile2/win32/dlldata.c
OfficeUtils/win32/OfficeUtilsLib/OfficeUtilsLib/ReadMe.txt
X2tConverter/**/Makefile.*
X2tConverter/ASCOfficePPTXFile/PPTXLib/Linux/PPTXFormatLib/Makefile
X2tConverter/Common/DocxFormat/DocxFormatLib/Makefile
*.7z

View File

@ -1,14 +0,0 @@
language: cpp
compiler: gcc
dist: trusty
addons:
apt:
packages:
- p7zip-full
script:
- exit 0
# Build fails anyway. See explanation in
# https://github.com/ONLYOFFICE/core/pull/29#issuecomment-306773327
- cd Common/3dParty && ./make.sh
- cd ../../
- make

View File

@ -641,7 +641,7 @@ namespace DocFileFormat
}
}
else
{
{
std::string sCodePage;
std::map<int, std::string>::const_iterator pFind = NSUnicodeConverter::mapEncodingsICU.find(code_page);
if (pFind != NSUnicodeConverter::mapEncodingsICU.end())
@ -653,7 +653,7 @@ namespace DocFileFormat
sCodePage = "CP1250"/* + std::to_string(code_page)*/;
NSUnicodeConverter::CUnicodeConverter oConverter;
std::wstring unicode_string = oConverter.toUnicode((char*)bytes, size, sCodePage.c_str());
std::wstring unicode_string = oConverter.toUnicode((char*)bytes, (unsigned int)size, sCodePage.c_str());
for (size_t i = 0; i < unicode_string.size(); i++)
{

View File

@ -35,6 +35,7 @@
#include <map>
#include <list>
#include <boost/shared_ptr.hpp>
#include "../../DesktopEditor/common/File.h"
@ -112,7 +113,10 @@ namespace XMLTools
class XMLElement
========================================================================================================*/
class XMLElement
class XMLElement;
typedef class boost::shared_ptr<XMLElement> XMLElementPtr;
class XMLElement
{
typedef std::pair< std::wstring, std::wstring> AttributeValuePair;
@ -180,7 +184,20 @@ namespace XMLTools
}
m_Elements.push_back( element );
}
void AppendChild( XMLElementPtr element, bool uniq = false)
{
if (!element) return;
if (m_ChildMap.find(element->GetName()) != m_ChildMap.end())
{
if (uniq) return;
}
else
{
m_ChildMap.insert(m_ChildMap.end(), std::pair<std::wstring, int>(element->GetName(), 0));
}
m_Elements.push_back( *element.get() );
}
void RemoveChild( const XMLElement& element )
{
m_Elements.remove( element );
@ -368,7 +385,6 @@ namespace XMLTools
}
};
class CStringXmlWriter
{
std::wstring m_str;
@ -383,6 +399,10 @@ namespace XMLTools
{
m_str = strValue;
}
void Clear()
{
m_str.clear();
}
bool SaveToFile(const std::wstring& strFilePath, bool bEncodingToUTF8 = false)
{
NSFile::CFileBinary file;

View File

@ -77,24 +77,28 @@ namespace DocFileFormat
return static_cast<ByteStructure*>(newObject);
}
ByteStructure* AnnotationReferenceExDescriptor::ConstructObject(VirtualStreamReader* reader, int length)
AnnotationReferenceExDescriptors::AnnotationReferenceExDescriptors(size_t count, POLE::Stream* stream, unsigned int fc, unsigned int lcb)
{
AnnotationReferenceExDescriptor *newObject = new AnnotationReferenceExDescriptor();
if (reader->nWordVersion > 0)
if ((lcb > 0) && (NULL != stream))
{
VirtualStreamReader reader(stream, (ULONG)fc, 0);
if (fc > reader.GetSize()) return;
for (size_t i = 0; i < (std::min)((unsigned int)count, lcb / 18); i++)
{
_desc desc;
desc.nDTTM = DateAndTime(reader.ReadUInt32());
reader.ReadUInt16(); //padding1
desc.nDepth = reader.ReadUInt32();
desc.nDiatrdParent = reader.ReadUInt32();
unsigned int flag = reader.ReadUInt32();
desc.fInkAtn = GETBIT(flag, 1);
m_ReferencesEx.push_back(desc);
}
}
else
{
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

@ -47,7 +47,7 @@ namespace DocFileFormat
return (nWordVersion > 0) ? STRUCTURE_SIZE_OLD : STRUCTURE_SIZE;
}
AnnotationReferenceDescriptor() : m_AuthorIndex(0), m_BookmarkId(0)
AnnotationReferenceDescriptor() : m_AuthorIndex(0), m_BookmarkId(0), m_CommentId(-1)
{
}
@ -60,32 +60,28 @@ namespace DocFileFormat
std::wstring m_UserInitials;
unsigned short m_AuthorIndex;
int m_BookmarkId;
int m_CommentId;
};
class AnnotationReferenceExDescriptor: public ByteStructure
class AnnotationReferenceExDescriptors
{
public:
static const int STRUCTURE_SIZE = 18;
static const int STRUCTURE_SIZE_OLD = 0;
AnnotationReferenceExDescriptors(size_t count, POLE::Stream* stream, unsigned int fc, unsigned int lcb);
static const int GetSize(int nWordVersion)
{
return (nWordVersion > 0) ? STRUCTURE_SIZE_OLD : STRUCTURE_SIZE;
}
AnnotationReferenceExDescriptor() : m_nDepth(0), m_nDiatrdParent(0), m_fInkAtn(false)
virtual ~AnnotationReferenceExDescriptors()
{
}
virtual ~AnnotationReferenceExDescriptor()
//virtual ByteStructure* ConstructObject( VirtualStreamReader* reader, int length );
struct _desc
{
}
DateAndTime nDTTM;
unsigned int nDepth = 0;
int nDiatrdParent = 0;
bool fInkAtn = false;
};
virtual ByteStructure* ConstructObject( VirtualStreamReader* reader, int length );
DateAndTime m_nDTTM;
unsigned int m_nDepth;
unsigned int m_nDiatrdParent;
bool m_fInkAtn;
std::vector<_desc> m_ReferencesEx;
};
}

View File

@ -48,6 +48,9 @@ namespace DocFileFormat
{
m_document = static_cast<WordDocument*>( visited );
_UINT64 x = 0x10000001;
std::vector<std::wstring> arrParaId;
if ( ( m_document != NULL ) && ( m_document->FIB->m_RgLw97.ccpAtn > 0 ) )
{
m_context->_docx->RegisterComments();
@ -55,7 +58,6 @@ namespace DocFileFormat
m_pXmlWriter->WriteNodeBegin( L"?xml version=\"1.0\" encoding=\"UTF-8\"?");
m_pXmlWriter->WriteNodeBegin( L"w:comments", TRUE );
//write namespaces
m_pXmlWriter->WriteAttribute( L"xmlns:w", OpenXmlNamespaces::WordprocessingML );
m_pXmlWriter->WriteAttribute( L"xmlns:v", OpenXmlNamespaces::VectorML );
m_pXmlWriter->WriteAttribute( L"xmlns:o", OpenXmlNamespaces::Office );
@ -82,37 +84,29 @@ namespace DocFileFormat
int cp = m_document->FIB->m_RgLw97.ccpText + m_document->FIB->m_RgLw97.ccpFtn + m_document->FIB->m_RgLw97.ccpHdr;
size_t count = m_document->AnnotationsReferencePlex->Elements.size();
for (size_t index = 0; index < count; ++index)
{
AnnotationReferenceDescriptor* atrdPre10 = static_cast<AnnotationReferenceDescriptor*>(m_document->AnnotationsReferencePlex->Elements[index]);
AnnotationReferenceExDescriptor* atrdPost10 = NULL;
if ((m_document->AnnotationsReferenceExPlex) && (index < m_document->AnnotationsReferenceExPlex->Elements.size()))
{
atrdPost10 = static_cast<AnnotationReferenceExDescriptor*>(m_document->AnnotationsReferenceExPlex->Elements[index]);
}
for (size_t index = 0; index < count; ++index)
{
_paraId.clear();
AnnotationReferenceDescriptor* atrdPre10 = static_cast<AnnotationReferenceDescriptor*>(m_document->AnnotationsReferencePlex->Elements[index]);
m_pXmlWriter->WriteNodeBegin( L"w:comment", TRUE );
if (atrdPre10->m_BookmarkId < 0)//-1 - easy ref (not start/end comment ref)
{
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::SizeTToWideString( index + 1 + count + 1024 ));
}
else
{
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::SizeTToWideString( index + 1 ));
}
if (atrdPost10)
{
m_pXmlWriter->WriteAttribute( L"w:date", atrdPost10->m_nDTTM.getString());
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::SizeTToWideString(atrdPre10->m_CommentId));
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 ) ));
}
if ((m_document->AnnotationsReferencesEx) && (index < m_document->AnnotationsReferencesEx->m_ReferencesEx.size()))
{
m_pXmlWriter->WriteAttribute( L"w:date", m_document->AnnotationsReferencesEx->m_ReferencesEx[index].nDTTM.getString());
}
m_pXmlWriter->WriteAttribute( L"w:initials", FormatUtils::XmlEncode(atrdPre10->m_UserInitials));
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
while ( ( cp - m_document->FIB->m_RgLw97.ccpText - m_document->FIB->m_RgLw97.ccpFtn - m_document->FIB->m_RgLw97.ccpHdr ) < (*m_document->IndividualCommentsPlex)[index + 1] )
@ -132,16 +126,70 @@ namespace DocFileFormat
}
else
{
//this PAPX is for a normal paragraph
if ((m_document->AnnotationsReferencesEx) && (index < m_document->AnnotationsReferencesEx->m_ReferencesEx.size()))
{
_paraId = XmlUtils::IntToString(x++, L"%08X");
}
cp = writeParagraph(cp, 0x7fffffff);
}
}
if (false == _paraId.empty())
arrParaId.push_back(_paraId);
m_pXmlWriter->WriteNodeEnd(L"w:comment" );
}
m_pXmlWriter->WriteNodeEnd( L"w:comments" );
m_context->_docx->CommentsXML = std::wstring(m_pXmlWriter->GetXmlString());
m_pXmlWriter->Clear();
if (false == arrParaId.empty() && (m_document->AnnotationsReferencesEx) && (false == m_document->AnnotationsReferencesEx->m_ReferencesEx.empty()))
{
m_context->_docx->RegisterCommentsExtended();
m_pXmlWriter->WriteNodeBegin( L"?xml version=\"1.0\" encoding=\"UTF-8\"?");
m_pXmlWriter->WriteNodeBegin( L"w15:commentsEx", TRUE );
m_pXmlWriter->WriteAttribute( L"xmlns:w", OpenXmlNamespaces::WordprocessingML );
m_pXmlWriter->WriteAttribute( L"xmlns:v", OpenXmlNamespaces::VectorML );
m_pXmlWriter->WriteAttribute( L"xmlns:o", OpenXmlNamespaces::Office );
m_pXmlWriter->WriteAttribute( L"xmlns:w10", OpenXmlNamespaces::OfficeWord );
m_pXmlWriter->WriteAttribute( L"xmlns:r", OpenXmlNamespaces::Relationships );
m_pXmlWriter->WriteAttribute( L"xmlns:wpc", L"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" );
m_pXmlWriter->WriteAttribute( L"xmlns:cx", L"http://schemas.microsoft.com/office/drawing/2014/chartex" );
m_pXmlWriter->WriteAttribute( L"xmlns:cx1", L"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" );
m_pXmlWriter->WriteAttribute( L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006" );
m_pXmlWriter->WriteAttribute( L"xmlns:m", L"http://schemas.openxmlformats.org/officeDocument/2006/math" );
m_pXmlWriter->WriteAttribute( L"xmlns:wp14", L"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" );
m_pXmlWriter->WriteAttribute( L"xmlns:wp", L"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" );
m_pXmlWriter->WriteAttribute( L"xmlns:w14", L"http://schemas.microsoft.com/office/word/2010/wordml" );
m_pXmlWriter->WriteAttribute( L"xmlns:w15", L"http://schemas.microsoft.com/office/word/2012/wordml" );
m_pXmlWriter->WriteAttribute( L"xmlns:w16se", L"http://schemas.microsoft.com/office/word/2015/wordml/symex" );
m_pXmlWriter->WriteAttribute( L"xmlns:wpg", L"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" );
m_pXmlWriter->WriteAttribute( L"xmlns:wpi", L"http://schemas.microsoft.com/office/word/2010/wordprocessingInk" );
m_pXmlWriter->WriteAttribute( L"xmlns:wne", L"http://schemas.microsoft.com/office/word/2006/wordml" );
m_pXmlWriter->WriteAttribute( L"xmlns:wps", L"http://schemas.microsoft.com/office/word/2010/wordprocessingShape" );
m_pXmlWriter->WriteAttribute( L"mc:Ignorable", L"w14 w15 w16se wp14");
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
for (size_t index = 0; index < m_document->AnnotationsReferencesEx->m_ReferencesEx.size(); ++index)
{
m_pXmlWriter->WriteNodeBegin( L"w15:commentEx", TRUE );
m_pXmlWriter->WriteAttribute( L"w15:paraId", arrParaId[index]);
if (m_document->AnnotationsReferencesEx->m_ReferencesEx[index].nDepth > 0)
{
m_pXmlWriter->WriteAttribute( L"w15:paraIdParent", arrParaId[index + m_document->AnnotationsReferencesEx->m_ReferencesEx[index].nDiatrdParent]);
}
m_pXmlWriter->WriteAttribute( L"w15:done", L"0");
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
m_pXmlWriter->WriteNodeEnd(L"w15:commentEx" );
}
m_pXmlWriter->WriteNodeEnd( L"w15:commentsEx" );
m_context->_docx->CommentsExtendedXML = std::wstring(m_pXmlWriter->GetXmlString());
}
}
}
};

View File

@ -91,6 +91,7 @@ namespace WordprocessingMLContentTypes
static const wchar_t* Settings = L"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml";
static const wchar_t* Comments = L"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml";
static const wchar_t* CommentsExtended = L"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml";
static const wchar_t* Footnotes = L"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml";
static const wchar_t* Endnotes = L"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml";
@ -154,6 +155,7 @@ namespace OpenXmlRelationshipTypes
static const wchar_t* CustomXml = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml";
static const wchar_t* CustomXmlProperties = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps";
static const wchar_t* Comments = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
static const wchar_t* CommentsExtended = L"http://schemas.microsoft.com/office/2011/relationships/commentsExtended";
static const wchar_t* Footnotes = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes";
static const wchar_t* Endnotes = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes";
static const wchar_t* Header = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header";

View File

@ -50,7 +50,7 @@
namespace DocFileFormat
{
Converter::Converter()
Converter::Converter() : m_nUserLCID(-1)
{
}
@ -204,7 +204,7 @@ namespace DocFileFormat
_UINT32 Converter::LoadAndConvert(const std::wstring& strSrcFile, const std::wstring& strDstDirectory, const std::wstring& password, const ProgressCallback* progress, bool &bMacros)
{
WordDocument doc(progress, m_sTempFolder);
WordDocument doc(progress, m_sTempFolder, m_nUserLCID);
WordprocessingDocument docx(strDstDirectory, &doc);
_UINT32 result = doc.LoadDocument(strSrcFile, password);

View File

@ -48,6 +48,7 @@ namespace DocFileFormat
~Converter();
std::wstring m_sTempFolder;
int m_nUserLCID;
_UINT32 LoadAndConvert(const std::wstring & strSrcFile, const std::wstring & strDstDirectory, const std::wstring & password, const ProgressCallback* progress, bool &bMacros);

View File

@ -37,103 +37,80 @@ namespace DocFileFormat
{
class DateAndTime
{
private:
/// minutes (0-59)
short mint;
/// hours (0-23)
short hr;
/// day of month (1-31)
short dom;
/// month (1-12)
short mon;
/// year (1900-2411)-1900
short yr;
/// weekday<br/>
/// 0 Sunday
/// 1 Monday
/// 2 Tuesday
/// 3 Wednesday
/// 4 Thursday
/// 5 Friday
/// 6 Saturday
short wdy;
protected:
short minutes;
short hour;
short day;
short month;
short year;
/// 0 Sunday
/// 1 Monday
/// 2 Tuesday
/// 3 Wednesday
/// 4 Thursday
/// 5 Friday
/// 6 Saturday
short weekday;
public:
DateAndTime()
{
setDefaultValues();
}
DateAndTime( unsigned int val )
DateAndTime( _UINT32 val )
{
DateAndTime((unsigned char*)&val, 4);
unsigned char* bytes = ((unsigned char*) &val);
minutes = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, 4 ), 0, 6 );
hour = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, 4 ), 6, 5 );
day = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, 4 ), 11, 5 );
month = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, 4 ), 16, 4 );
year = (short)( 1900 + FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, 4 ), 20, 9 ) );
weekday = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, 4 ), 29, 3 );
}
DateAndTime( unsigned char* bytes, int size )
{
if ( size == 4 )
{
this->mint = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 0, 6 );
this->hr = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 6, 5 );
this->dom = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 11, 5 );
this->mon = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 16, 4 );
this->yr = (short)( 1900 + FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 20, 9 ) );
this->wdy = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 29, 3 );
minutes = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 0, 6 );
hour = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 6, 5 );
day = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 11, 5 );
month = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 16, 4 );
year = (short)( 1900 + FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 20, 9 ) );
weekday = (short)FormatUtils::GetIntFromBits( FormatUtils::BytesToInt32( bytes, 0, size ), 29, 3 );
}
else
{
//throw new ByteParseException("Cannot parse the struct DTTM, the length of the struct doesn't match");
}
}
DateAndTime& operator=(const DateAndTime& oSrc)
{
minutes = oSrc.minutes;
hour = oSrc.hour;
day = oSrc.day;
month = oSrc.month;
year = oSrc.year;
weekday = oSrc.weekday;
return (*this);
}
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";
return std::to_wstring(year) + L"-" + (month < 9 ? L"0" : L"" ) + std::to_wstring(month) + L"-" +
(day < 9 ? L"0" : L"" ) + std::to_wstring(day) + L"T" +
(hour < 9 ? L"0" : L"" ) + std::to_wstring(hour) + L":" +
(minutes < 9 ? L"0" : L"" ) + std::to_wstring(minutes) + L":00Z";
}
#if defined(_WIN32) || defined(_WIN64)
SYSTEMTIME ToSYSTEMTIME()
{
SYSTEMTIME st = { 0 };
if ( ( this->yr == 1900 ) && ( this->mon == 0 ) && ( this->dom == 0 ) &&
( this->hr == 0 ) && ( this->mint == 0 ) )
{
st.wYear = 1900;
st.wMonth = 1;
st.wDayOfWeek = 0;
st.wDay = 1;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;
st.wMilliseconds = 0;
return st;
}
else
{
st.wYear = this->yr;
st.wMonth = this->mon;
st.wDayOfWeek = 0;
st.wDay = this->dom;
st.wHour = this->hr;
st.wMinute = this->mint;
st.wSecond = 0;
st.wMilliseconds = 0;
return st;
}
}
#endif
private:
void setDefaultValues()
{
this->dom = 0;
this->hr = 0;
this->mint = 0;
this->mon = 0;
this->wdy = 0;
this->yr = 0;
day = 0;
hour = 0;
minutes = 0;
month = 0;
weekday = 0;
year = 0;
}
};
}

View File

@ -61,7 +61,7 @@ namespace DocFileFormat
DocumentMapping::DocumentMapping(ConversionContext* context, XMLTools::CStringXmlWriter* writer, IMapping* caller):_skipRuns(0), _lastValidPapx(NULL), _lastValidSepx(NULL),
AbstractOpenXmlMapping(writer), _sectionNr(0), _footnoteNr(0), _endnoteNr(0),
_commentNr(0), _caller(caller)
_commentNr(1), _caller(caller)
{
m_document = NULL;
m_context = context;
@ -217,6 +217,11 @@ namespace DocFileFormat
// start paragraph
m_pXmlWriter->WriteNodeBegin(L"w:p", true);
if (false == _paraId.empty())
{
m_pXmlWriter->WriteAttribute(L"w14:paraId", _paraId);
}
writeParagraphRsid(papx);
// ----------- check for section properties
@ -369,7 +374,7 @@ namespace DocFileFormat
if (DocFileFormat::sprmPRsid == iter->OpCode)
{
std::wstring id = FormatUtils::IntToFormattedWideString(FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize), L"%08x");
std::wstring id = FormatUtils::IntToFormattedWideString(FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize), L"%08X");
m_context->AddRsid(id);
m_pXmlWriter->WriteAttribute(L"w:rsidP", id);
@ -416,21 +421,21 @@ namespace DocFileFormat
//append rsids
if (0 != rev.Rsid)
{
std::wstring rsid = FormatUtils::IntToFormattedWideString(rev.Rsid, L"%08x");
std::wstring rsid = FormatUtils::IntToFormattedWideString(rev.Rsid, L"%08X");
m_pXmlWriter->WriteAttribute(L"w:rsidR", rsid);
m_context->AddRsid(rsid);
}
if (0 != rev.RsidDel)
{
std::wstring rsidDel = FormatUtils::IntToFormattedWideString(rev.RsidDel, L"%08x");
std::wstring rsidDel = FormatUtils::IntToFormattedWideString(rev.RsidDel, L"%08X");
m_pXmlWriter->WriteAttribute(L"w:rsidDel", rsidDel);
m_context->AddRsid(rsidDel);
}
if (0 != rev.RsidProp)
{
std::wstring rsidProp = FormatUtils::IntToFormattedWideString(rev.RsidProp, L"%08x");
std::wstring rsidProp = FormatUtils::IntToFormattedWideString(rev.RsidProp, L"%08X");
m_pXmlWriter->WriteAttribute(L"w:rsidRPr", rsidProp);
m_context->AddRsid(rsidProp);
}
@ -1049,18 +1054,37 @@ namespace DocFileFormat
m_pXmlWriter->WriteNodeBegin( L"w:annotationRef", true );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
else if ((m_document->AnnotationsReferencePlex) && (_commentNr <= m_document->AnnotationsReferencePlex->Elements.size()))
else if (m_document->AnnotationsReferencePlex)
{
m_pXmlWriter->WriteNodeBegin( L"w:commentReference", true );
int index = _commentNr++;
AnnotationReferenceDescriptor* atrdPre10 = dynamic_cast<AnnotationReferenceDescriptor*>( m_document->AnnotationsReferencePlex->GetStruct(cp));
AnnotationReferenceDescriptor* atrdPre10 = static_cast<AnnotationReferenceDescriptor*>(m_document->AnnotationsReferencePlex->Elements[index - 1]);
if (atrdPre10->m_BookmarkId < 0)
index += m_document->AnnotationsReferencePlex->Elements.size() + 1024;
if (atrdPre10)
{
if (atrdPre10->m_CommentId < 0)
{
if (atrdPre10->m_BookmarkId < 0)
{
atrdPre10->m_CommentId = _commentNr++;
}
else
{
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(atrdPre10->m_BookmarkId);
if (pFind == m_document->mapCommentsBookmarks.end())
{
atrdPre10->m_CommentId = _commentNr++;
m_document->mapCommentsBookmarks.insert(std::make_pair(atrdPre10->m_BookmarkId, atrdPre10->m_CommentId));
}
else
{
atrdPre10->m_CommentId = pFind->second;
}
}
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString(atrdPre10->m_CommentId));
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString(index));
m_pXmlWriter->WriteNodeEnd( L"", true );
}
}
@ -1353,6 +1377,7 @@ namespace DocFileFormat
fEndNestingLevel = ( iter->Arguments[0] == 1 ) ? (true) : (false);
}break;
case sprmOldPFInTable:
case sprmPItap:
{
iTap_current = FormatUtils::BytesToUInt32( iter->Arguments, 0, iter->argumentsSize );
@ -1810,16 +1835,32 @@ namespace DocFileFormat
for (size_t i = 0; i < m_document->AnnotStartEndCPs.size(); i++)
{
if (m_document->AnnotStartEndCPs[i].first == cp)
if (m_document->AnnotStartEndCPs[i].start == cp)
{
result = writeAnnotationStart(i + 1);
_commentNr = i + 1;
int index = -1;
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapCommentsBookmarks.end())
{
index = _commentNr++;
m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
}
else index = pFind->second;
result = writeAnnotationStart(index);
}
if (m_document->AnnotStartEndCPs[i].second == cp)
if (m_document->AnnotStartEndCPs[i].end == cp)
{
result = writeAnnotationEnd(i + 1);
//_commentNr = i + 1;
int index = -1;
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapCommentsBookmarks.end())
{
index = _commentNr++;
m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
}
else index = pFind->second;
result = writeAnnotationEnd(index);
}
}

View File

@ -158,6 +158,8 @@ namespace DocFileFormat
std::wstring _writeAfterRun;
std::wstring _lastOLEObject;
int _cacheListNum;
std::wstring _paraId;
struct fieldLevels
{

View File

@ -492,9 +492,12 @@ namespace DocFileFormat
struct FibNew
{
FibNew() : nFibNew(Fib1997), cQuickSavesNew(0) {}
FibNew() : nFibNew(Fib1997), cQuickSavesNew(0), lidThemeOther(0), lidThemeFE(0), lidThemeCS(0) {}
FibVersion nFibNew;
WORD cQuickSavesNew;
WORD lidThemeOther;
WORD lidThemeFE;
WORD lidThemeCS;
};
@ -545,11 +548,11 @@ namespace DocFileFormat
}
else
{
/*ccpSpare0 = */ reader.ReadInt32();
/*ccpSpare1 = */ reader.ReadInt32();
/*ccpSpare2 = */ reader.ReadInt32();
int ccpSpare0 = reader.ReadInt32();
int ccpSpare1 = reader.ReadInt32();
int ccpSpare2 = reader.ReadInt32();
}
/*ccpSpare3 = */ reader.ReadInt32();
int ccpSpare3 = reader.ReadInt32();
if (m_FibBase.nFib > Fib1985)
{
@ -872,23 +875,43 @@ namespace DocFileFormat
}
if (m_FibBase.nFib > Fib1995 || m_FibBase.nFib == 0)
{
reader.ReadBytes(8, false); //68
int reserv1 = reader.ReadInt32();
int reserv2 = reader.ReadInt32();
m_RgLw97.ccpText = reader.ReadInt32(); //76
m_RgLw97.ccpFtn = reader.ReadInt32(); //80
m_RgLw97.ccpHdr = reader.ReadInt32(); //84
reader.ReadBytes( 4, false ); //88
int reserv3 = reader.ReadInt32();
m_RgLw97.ccpAtn = reader.ReadInt32(); //92
m_RgLw97.ccpEdn = reader.ReadInt32(); //96
m_RgLw97.ccpTxbx = reader.ReadInt32(); //100
m_RgLw97.ccpHdrTxbx = reader.ReadInt32(); //104
reader.ReadBytes(44, false); //108
int reserv4 = reader.ReadInt32();
int reserv5 = reader.ReadInt32();
int reserv6 = reader.ReadInt32();
int reserv7 = reader.ReadInt32();
int reserv8 = reader.ReadInt32();
int reserv9 = reader.ReadInt32();
int reserv10 = reader.ReadInt32();
int reserv11 = reader.ReadInt32();
int reserv12 = reader.ReadInt32();
int reserv13 = reader.ReadInt32();
int reserv14 = reader.ReadInt32();
cbRgFcLcb = reader.ReadUInt16(); //152
switch(cbRgFcLcb)
{
case 0x005D: m_FibBase.nFib = Fib1997; break;
case 0x006C: m_FibBase.nFib = Fib2000; break;
case 0x0088: m_FibBase.nFib = Fib2002; break;
case 0x00A4: m_FibBase.nFib = Fib2003; break;
case 0x00B7: m_FibBase.nFib = Fib2007; break;
}
m_FibWord97.fcStshfOrig = reader.ReadUInt32(); //154
m_FibWord97.lcbStshfOrig = reader.ReadUInt32(); //158
m_FibWord97.fcStshf = reader.ReadUInt32(); //162
@ -922,7 +945,7 @@ namespace DocFileFormat
m_FibWord97.fcSttbfFfn = reader.ReadUInt32(); //274
m_FibWord97.lcbSttbfFfn = reader.ReadUInt32(); //278
m_FibWord97.fcPlcfFldMom = reader.ReadUInt32(); //282
m_FibWord97.lcbPlcfFldMom = reader.ReadUInt32(); //286
m_FibWord97.lcbPlcfFldMom = reader.ReadUInt32(); //286
m_FibWord97.fcPlcfFldHdr = reader.ReadUInt32(); //290
m_FibWord97.lcbPlcfFldHdr = reader.ReadUInt32(); //294
m_FibWord97.fcPlcfFldFtn = reader.ReadUInt32(); //298
@ -1286,11 +1309,24 @@ namespace DocFileFormat
if (cswNew != 0)
{
//Read the FibRgCswNew
//Read the FibRgCswNew
m_FibNew.nFibNew = (FibVersion)reader.ReadUInt16();
if (m_FibNew.nFibNew == 0) m_FibNew.nFibNew = Fib1997;
m_FibNew.cQuickSavesNew = reader.ReadUInt16();
if (m_FibNew.nFibNew == 0x00D9 ||
m_FibNew.nFibNew == 0x0101 ||
m_FibNew.nFibNew == 0x010C )
{
}
else if (m_FibNew.nFibNew == 0x0112)
{
m_FibNew.lidThemeOther = reader.ReadUInt16();
m_FibNew.lidThemeFE = reader.ReadUInt16();
m_FibNew.lidThemeCS = reader.ReadUInt16();
}
}
}
FileInformationBlock( VirtualStreamReader reader )
@ -1363,13 +1399,26 @@ namespace DocFileFormat
}
else if (m_FibBase.nFib > Fib1995 || m_FibBase.nFib == 0)
{
//read the RgW97
reader.ReadBytes( 26, false ); //34
//read the RgW97
int reserv1 = reader.ReadUInt16();
int reserv2 = reader.ReadUInt16();
int reserv3 = reader.ReadUInt16();
int reserv4 = reader.ReadUInt16();
int reserv5 = reader.ReadUInt16();
int reserv6 = reader.ReadUInt16();
int reserv7 = reader.ReadUInt16();
int reserv8 = reader.ReadUInt16();
int reserv9 = reader.ReadUInt16();
int reserv10 = reader.ReadUInt16();
int reserv11 = reader.ReadUInt16();
int reserv12 = reader.ReadUInt16();
int reserv13 = reader.ReadUInt16();
m_RgW97.lidFE = reader.ReadUInt16(); //60
cslw = reader.ReadUInt16(); //62
//read the RgLW97
//read the RgLW97
m_RgLw97.cbMac = reader.ReadInt32(); //64
}

View File

@ -124,12 +124,12 @@ namespace DocFileFormat
//font signature
m_pXmlWriter->WriteNodeBegin( L"w:sig", TRUE );
m_pXmlWriter->WriteAttribute( L"w:usb0", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield0, L"%08x" ));
m_pXmlWriter->WriteAttribute( L"w:usb1", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield1, L"%08x" ));
m_pXmlWriter->WriteAttribute( L"w:usb2", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield2, L"%08x" ));
m_pXmlWriter->WriteAttribute( L"w:usb3", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield3, L"%08x" ));
m_pXmlWriter->WriteAttribute( L"w:csb0", FormatUtils::IntToFormattedWideString( font->fs.CodePageBitfield0, L"%08x" ));
m_pXmlWriter->WriteAttribute( L"w:csb1", FormatUtils::IntToFormattedWideString( font->fs.CodePageBitfield1, L"%08x" ));
m_pXmlWriter->WriteAttribute( L"w:usb0", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield0, L"%08X" ));
m_pXmlWriter->WriteAttribute( L"w:usb1", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield1, L"%08X" ));
m_pXmlWriter->WriteAttribute( L"w:usb2", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield2, L"%08X" ));
m_pXmlWriter->WriteAttribute( L"w:usb3", FormatUtils::IntToFormattedWideString( font->fs.UnicodeSubsetBitfield3, L"%08X" ));
m_pXmlWriter->WriteAttribute( L"w:csb0", FormatUtils::IntToFormattedWideString( font->fs.CodePageBitfield0, L"%08X" ));
m_pXmlWriter->WriteAttribute( L"w:csb1", FormatUtils::IntToFormattedWideString( font->fs.CodePageBitfield1, L"%08X" ));
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
m_pXmlWriter->WriteNodeEnd( L"w:sig" );

View File

@ -126,7 +126,7 @@ FormFieldData::FormFieldData( int type, const CharacterPropertyExceptions* chpx,
break;
case sprmCRsidText:
{
rsid = FormatUtils::IntToFormattedWideString(FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize), L"%08x");
rsid = FormatUtils::IntToFormattedWideString(FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize), L"%08X");
}
break;
case sprmCFData:

View File

@ -122,7 +122,8 @@ namespace DocFileFormat
fNumber1 == val.fNumber1 &&
fNumberAcross == val.fNumberAcross &&
fRestartHdn == val.fRestartHdn &&
fSpareX == val.fSpareX;
fSpareX == val.fSpareX &&
xst == val.xst;
return res;
}
@ -158,7 +159,8 @@ namespace DocFileFormat
fNumber1 == val->fNumber1 &&
fNumberAcross == val->fNumberAcross &&
fRestartHdn == val->fRestartHdn &&
fSpareX == val->fSpareX;
fSpareX == val->fSpareX &&
xst == val->xst;
return res;

View File

@ -129,6 +129,7 @@ namespace DocFileFormat
std::wstring xst; //32 chars ansi
public:
std::wstring rPr;
bool operator == (const NumberingDescriptor & val) const;
bool operator == (const NumberingDescriptorPtr & val) const;

View File

@ -72,16 +72,17 @@ namespace DocFileFormat
}
}
size_t ListTable::appendNumbering( NumberingDescriptorPtr &desc )
size_t ListTable::appendNumbering( NumberingDescriptorPtr &desc, const std::wstring & rPr )
{
for (size_t i = 0; i < listNumbering.size(); ++i)
{
if (listNumbering[i]->operator==(desc))
if (listNumbering[i]->operator == (desc))
{
return listNumbering[i]->id;
}
}
desc->id = listData.size() + listNumbering.size()/* + 1*/;
desc->rPr = rPr;
desc->id = listData.size() + listNumbering.size() + 1; // 23.doc
listNumbering.push_back(desc);
return desc->id;
}

View File

@ -47,6 +47,6 @@ namespace DocFileFormat
virtual ~ListTable();
ListTable( FileInformationBlock* fib, POLE::Stream* tableStream );
size_t appendNumbering( NumberingDescriptorPtr &desc );
size_t appendNumbering( NumberingDescriptorPtr &desc, const std::wstring & rPr );
};
}

View File

@ -87,7 +87,7 @@ namespace DocFileFormat
m_document->DocProperties->bDisplayBackgroundShape = true;
ShapeContainer* pShape = m_document->GetOfficeArt()->GetShapeBackgound();
ODRAW::OfficeArtFOPTEPtr boolFill = pShape->ExtractOption(fillStyleBooleanProperties);
ODRAW::OfficeArtFOPTEPtr boolFill = pShape->ExtractOption(ODRAW::fillStyleBooleanProperties);
ODRAW::FillStyleBooleanProperties* booleans = dynamic_cast<ODRAW::FillStyleBooleanProperties*>(boolFill.get());

View File

@ -97,7 +97,7 @@ namespace DocFileFormat
//nsid
m_pXmlWriter->WriteNodeBegin( L"w:nsid", TRUE );
m_pXmlWriter->WriteAttribute( L"w:val", FormatUtils::IntToFormattedWideString( rglst->listData[i]->lsid, L"%08x" ));
m_pXmlWriter->WriteAttribute( L"w:val", FormatUtils::IntToFormattedWideString( rglst->listData[i]->lsid, L"%08X" ));
m_pXmlWriter->WriteNodeEnd( L"", TRUE );
//multiLevelType
@ -120,7 +120,7 @@ namespace DocFileFormat
//template
m_pXmlWriter->WriteNodeBegin( L"w:tmpl", TRUE );
m_pXmlWriter->WriteAttribute( L"w:val", FormatUtils::IntToFormattedWideString( rglst->listData[i]->tplc, L"%08x"));
m_pXmlWriter->WriteAttribute( L"w:val", FormatUtils::IntToFormattedWideString( rglst->listData[i]->tplc, L"%08X"));
m_pXmlWriter->WriteNodeEnd( L"", TRUE );
// writes the levels
@ -540,17 +540,24 @@ namespace DocFileFormat
m_pXmlWriter->WriteNodeEnd(L"w:pPr");
// rPr
m_pXmlWriter->WriteNodeBegin( L"w:rPr", FALSE );
if (!fontFamily.empty())
if (false == lvl->rPr.empty())
{
m_pXmlWriter->WriteNodeBegin( L"w:rFonts", TRUE );
// w:hint="default"
m_pXmlWriter->WriteAttribute(L"w:hAnsi",fontFamily);
m_pXmlWriter->WriteAttribute(L"w:ascii",fontFamily);
m_pXmlWriter->WriteNodeEnd( L"", TRUE );
m_pXmlWriter->WriteString( lvl->rPr );
}
else
{
m_pXmlWriter->WriteNodeBegin( L"w:rPr", FALSE );
if (!fontFamily.empty())
{
m_pXmlWriter->WriteNodeBegin( L"w:rFonts", TRUE );
// w:hint="default"
m_pXmlWriter->WriteAttribute(L"w:hAnsi", fontFamily);
m_pXmlWriter->WriteAttribute(L"w:ascii", fontFamily);
m_pXmlWriter->WriteNodeEnd( L"", TRUE );
}
m_pXmlWriter->WriteNodeEnd(L"w:rPr");
}
m_pXmlWriter->WriteNodeEnd(L"w:rPr");
m_pXmlWriter->WriteNodeEnd(L"w:lvl");
}
@ -702,7 +709,7 @@ namespace DocFileFormat
}
}
if (isPictureBullet)
if (isPictureBullet && false == m_document->PictureBulletsCPsMap.empty())
{
m_pXmlWriter->WriteNodeBegin(L"w:lvlPicBulletId",TRUE);
m_pXmlWriter->WriteAttribute(L"w:val",FormatUtils::IntToWideString(index));

View File

@ -80,7 +80,7 @@ namespace DocFileFormat
ShapeOptions* sh_options = dynamic_cast<ShapeOptions*>( this->Children[j] );
if (sh_options)
{
if (sh_options->OptionsByID.end() != sh_options->OptionsByID.find(Pib))
if (sh_options->OptionsByID.end() != sh_options->OptionsByID.find(ODRAW::pib))
{
m_nShapeType = msosptPictureFrame;
}
@ -101,7 +101,7 @@ namespace DocFileFormat
return new ShapeContainer( _reader, bodySize, typeCode, version, instance );
}
ODRAW::OfficeArtFOPTEPtr ExtractOption(const PropertyId & prop) const
ODRAW::OfficeArtFOPTEPtr ExtractOption(const ODRAW::ePropertyId & prop) const
{
ODRAW::OfficeArtFOPTEPtr ret;
@ -111,7 +111,7 @@ namespace DocFileFormat
if ( opt == NULL ) continue;
std::map<PropertyId, ODRAW::OfficeArtFOPTEPtr>::iterator pFind = opt->OptionsByID.find(prop);
std::map<ODRAW::ePropertyId, ODRAW::OfficeArtFOPTEPtr>::iterator pFind = opt->OptionsByID.find(prop);
if (pFind != opt->OptionsByID.end())
{
ret = pFind->second;

View File

@ -36,432 +36,6 @@
namespace DocFileFormat
{
typedef enum _PropertyId
{
//Transform
PropertyId_left=0,
PropertyId_top=1,
PropertyId_right=2,
PropertyId_bottom=3,
PropertyId_rotation=4,
PropertyId_gvPage=5,
PropertyId_fChangePage=61,
PropertyId_fFlipV=62,
PropertyId_fFlipH=63,
//Protection
//fLockAgainstUngrouping=118,
//fLockRotation=119,
//fLockAspectRatio=120,
//fLockPosition=121,
//fLockAgainstSelect=122,
//fLockCropping=123,
//fLockVertices=124,
//fLockText=125,
//fLockAdjustHandles=126,
protectionBooleans=127,
//Text
lTxid=128,
dxTextLeft=129,
dyTextTop=130,
dxTextRight=131,
dyTextBottom=132,
WrapText=133,
scaleText=134,
anchorText=135,
txflTextFlow=136,
cdirFont=137,
hspNext=138,
txdir=139,
ccol=140,
dzColMargin=141,
textBooleanProperties=191,
//GeoText
gtextUNICODE=192,
gtextRTF=193,
gtextAlign=194,
gtextSize=195,
gtextSpacing=196,
gtextFont=197,
gtextCSSFont=198,
//gtextFReverseRows=240,
//fGtext=241,
//gtextFVertical=242,
//gtextFKern=243,
//gtextFTight=244,
//gtextFStretch=245,
//gtextFShrinkFit=246,
//gtextFBestFit=247,
//gtextFNormalize=248,
//gtextFDxMeasure=249,
//gtextFBold=250,
//gtextFItalic=251,
//gtextFUnderline=252,
//gtextFShadow=253,
//gtextFSmallcaps=254,
geometryTextBooleanProperties=255,
//BLIP
cropFromTop=256,
cropFromBottom=257,
cropFromLeft=258,
cropFromRight=259,
Pib=260,
pibName=261,
pibFlags=262,
pictureTransparent=263,
pictureContrast=264,
pictureBrightness=265,
pictureGamma=266,
pictureId=267,
pictureDblCrMod=268,
pictureFillCrMod=269,
pictureLineCrMod=270,
pibPrint=271,
pibPrintName=272,
pibPrintFlags=273,
movie=274,
pictureRecolor=282,
picturePreserveGrays=313,
blipBooleanProperties=319,
//Geometry
geoLeft=320,
geoTop=321,
geoRight=322,
geoBottom=323,
shapePath=324,
pVertices=325,
pSegmentInfo=326,
adjustValue=327,
adjust2Value=328,
adjust3Value=329,
adjust4Value=330,
adjust5Value=331,
adjust6Value=332,
adjust7Value=333,
adjust8Value=334,
adjust9Value=335,
adjust10Value=336,
pConnectionSites=337,
pConnectionSitesDir=338,
xLimo=339,
yLimo=340,
pAdjustHandles=341,
pGuides=342,
pInscribe=343,
cxk=344,
pFragments=345,
geometryBooleans=383,
//Fill Style
fillType=384,
fillColor=385,
fillOpacity=386,
fillBackColor=387,
fillBackOpacity=388,
fillCrMod=389,
fillBlip=390,
fillBlipName=391,
fillBlipFlags=392,
fillWidth=393,
fillHeight=394,
fillAngle=395,
fillFocus=396,
fillToLeft=397,
fillToTop=398,
fillToRight=399,
fillToBottom=400,
fillRectLeft=401,
fillRectTop=402,
fillRectRight=403,
fillRectBottom=404,
fillDztype=405,
fillShadePreset=406,
fillShadeColors=407,
fillOriginX=408,
fillOriginY=409,
fillShapeOriginX=410,
fillShapeOriginY=411,
fillShadeType=412,
fillColorExt=414,
fillColorExtMod=416,
fillBackColorExt=418,
fillBackColorExtMod=420,
fillStyleBooleanProperties=447,
//Line Style
lineColor=448,
lineOpacity=449,
lineBackColor=450,
lineCrMod=451,
lineType=452,
lineFillBlip=453,
lineFillBlipName=454,
lineFillBlipFlags=455,
lineFillWidth=456,
lineFillHeight=457,
lineFillDztype=458,
lineWidth=459,
lineMiterLimit=460,
lineStyle=461,
lineDashing=462,
lineDashStyle=463,
lineStartArrowhead=464,
lineEndArrowhead=465,
lineStartArrowWidth=466,
lineStartArrowLength=467,
lineEndArrowWidth=468,
lineEndArrowLength=469,
lineJoinStyle=470,
lineEndCapStyle=471,
lineStyleBooleans=511,
//Shadow Style
shadowType=512,
shadowColor=513,
shadowHighlight=514,
shadowCrMod=515,
shadowOpacity=516,
shadowOffsetX=517,
shadowOffsetY=518,
shadowSecondOffsetX=519,
shadowSecondOffsetY=520,
shadowScaleXToX=521,
shadowScaleYToX=522,
shadowScaleXToY=523,
shadowScaleYToY=524,
shadowPerspectiveX=525,
shadowPerspectiveY=526,
shadowWeight=527,
shadowOriginX=528,
shadowOriginY=529,
shadowStyleBooleanProperties=575,
//Perspective Style
perspectiveType=576,
perspectiveOffsetX=577,
perspectiveOffsetY=578,
perspectiveScaleXToX=579,
perspectiveScaleYToX=580,
perspectiveScaleXToY=581,
perspectiveScaleYToY=582,
perspectivePerspectiveX=583,
perspectivePerspectiveY=584,
perspectiveWeight=585,
perspectiveOriginX=586,
perspectiveOriginY=587,
perspectiveStyleBooleanProperties=639,
//3D Object
c3DSpecularAmt=640,
c3DDiffuseAmt=641,
c3DShininess=642,
c3DEdgeThickness=643,
C3DExtrudeForward=644,
c3DExtrudeBackward=645,
c3DExtrudePlane=646,
c3DExtrusionColor=647,
c3DCrMod=648,
threeDObjectBooleanProperties=703,
//3D Style
c3DYRotationAngle=704,
c3DXRotationAngle=705,
c3DRotationAxisX=706,
c3DRotationAxisY=707,
c3DRotationAxisZ=708,
c3DRotationAngle=709,
c3DRotationCenterX=710,
c3DRotationCenterY=711,
c3DRotationCenterZ=712,
c3DRenderMode=713,
c3DTolerance=714,
c3DXViewpoint=715,
c3DYViewpoint=716,
c3DZViewpoint=717,
c3DOriginX=718,
c3DOriginY=719,
c3DSkewAngle=720,
c3DSkewAmount=721,
c3DAmbientIntensity=722,
c3DKeyX=723,
c3DKeyY=724,
c3DKeyZ=725,
c3DKeyIntensity=726,
c3DFillX=727,
c3DFillY=728,
c3DFillZ=729,
c3DFillIntensity=730,
threeDStyleBooleanProperties=767,
//Shape
hspMaster=769,
cxstyle=771,
bWMode=772,
bWModePureBW=773,
bWModeBW=774,
idDiscussAnchor=775,
dgmLayout=777,
dgmNodeKind=778,
dgmLayoutMRU=779,
wzEquationXML=780,
shapeBooleans=831,
//Callout
spcot=832,
dxyCalloutGap=833,
spcoa=834,
spcod=835,
dxyCalloutDropSpecified=836,
dxyCalloutLengthSpecified=837,
fCallout=889,
fCalloutAccentBar=890,
fCalloutTextBorder=891,
fCalloutMinusX=892,
fCalloutMinusY=893,
fCalloutDropAuto=894,
fCalloutLengthSpecified=895,
//Groupe Shape
wzName=896,
wzDescription=897,
pihlShape=898,
pWrapPolygonVertices=899,
dxWrapDistLeft=900,
dyWrapDistTop=901,
dxWrapDistRight=902,
dyWrapDistBottom=903,
lidRegroup=904,
groupLeft=905,
groupTop=906,
groupRight=907,
groupBottom=908,
wzTooltip=909,
wzScript=910,
posh=911,
posrelh=912,
posv=913,
posrelv=914,
pctHR=915,
alignHR=916,
dxHeightHR=917,
dxWidthHR=918,
wzScriptExtAttr=919,
scriptLang=920,
wzScriptIdAttr=921,
wzScriptLangAttr=922,
borderTopColor=923,
borderLeftColor=924,
borderBottomColor=925,
borderRightColor=926,
tableProperties=927,
tableRowProperties=928,
scriptHtmlLocation=929,
wzApplet=930,
wzFrameTrgtUnused=932,
wzWebBot=933,
wzAppletArg=934,
wzAccessBlob=936,
metroBlob=937,
dhgt=938,
groupShapeBooleans = 959,
relRotation = 964,
//Unknown HTML
wzLineId=1026,
wzFillId=1027,
wzPictureId=1028,
wzPathId=1029,
wzShadowId=1030,
wzPerspectiveId=1031,
wzGtextId=1032,
wzFormulaeId=1033,
wzHandlesId=1034,
wzCalloutId=1035,
wzLockId=1036,
wzTextId=1037,
wzThreeDId=1038,
FakeShapeType=1039,
fFakeMaster=1086,
//Diagramm
dgmt=1280,
dgmStyle=1281,
pRelationTbl=1284,
dgmScaleX=1285,
dgmScaleY=1286,
dgmDefaultFontSize=1287,
dgmConstrainBounds=1288,
dgmBaseTextScale=1289,
fBorderlessCanvas=1338,
fNonStickyInkCanvas=1339,
fDoFormat=1340,
fReverse=1341,
fDoLayout=1342,
diagramBooleans=1343,
//Web Component
webComponentWzHtml=1664,
webComponentWzName=1665,
webComponentWzUrl=1666,
webComponentWzProperties=1667,
fIsWebComponent=1727,
//Clip
pVerticesClip=1728,
pSegmentInfoClip=1729,
shapePathClip=1730,
fClipToWrap=1790,
fClippedOK=1791,
//Ink
pInkData=1792,
fInkAnnotation=1852,
fHitTestInk=1853,
fRenderShape=1854,
fRenderInk=1855,
//Signature
wzSigSetupId=1921,
wzSigSetupProvId=192,
wzSigSetupSuggSigner=1923,
wzSigSetupSuggSigner2=1924,
wzSigSetupSuggSignerEmail=1925,
wzSigSetupSignInst=1926,
wzSigSetupAddlXml=1927,
wzSigSetupProvUrl=1928,
fSigSetupShowSignDate=1980,
fSigSetupAllowComments=1981,
fSigSetupSignInstSet=1982,
fIsSignatureLine=1983,
//Groupe Shape 2
pctHoriz=1984,
pctVert=1985,
pctHorizPos=1986,
pctVertPos=1987,
sizerelh=1988,
sizerelv=1989,
colStart=1990,
colSpan=1991
} PropertyId;
//!!!TODO: Реальные значения не соответствуют значениям из спецификации!!!
typedef enum _PositionHorizontal
{
@ -534,8 +108,8 @@ namespace DocFileFormat
static const unsigned short TYPE_CODE_0xF121 = 0xF121;
static const unsigned short TYPE_CODE_0xF122 = 0xF122;
std::vector<ODRAW::OfficeArtFOPTEPtr> Options;
std::map<PropertyId, ODRAW::OfficeArtFOPTEPtr> OptionsByID;
std::vector<ODRAW::OfficeArtFOPTEPtr> Options;
std::map<ODRAW::ePropertyId, ODRAW::OfficeArtFOPTEPtr> OptionsByID;
ShapeOptions() : Record()
{
@ -566,7 +140,7 @@ namespace DocFileFormat
{
Options[i]->ReadComplexData(Reader);
}
OptionsByID.insert(std::make_pair((PropertyId)Options[i]->opid, Options[i]));
OptionsByID.insert(std::make_pair((ODRAW::ePropertyId)Options[i]->opid, Options[i]));
}
Reader->Seek(( pos + size ), 0/*STREAM_SEEK_SET*/);

View File

@ -359,24 +359,24 @@ namespace DocFileFormat
return FootnotesRelationshipsFile.RelID;
}
int OpenXmlPackage::RegisterEndnotes()
{
return AddPart( L"word", L"endnotes.xml", WordprocessingMLContentTypes::Endnotes, OpenXmlRelationshipTypes::Endnotes );
}
int OpenXmlPackage::AddEndnotesPart( const std::wstring& fileName, const std::wstring& relationshipType, const std::wstring& targetMode )
{
EndnotesRelationshipsFile.Relationships.push_back( Relationship( ( std::wstring( L"rId" ) + FormatUtils::IntToWideString( ++EndnotesRelationshipsFile.RelID ) ), relationshipType, fileName, targetMode ) );
return EndnotesRelationshipsFile.RelID;
}
int OpenXmlPackage::RegisterComments()
{
return AddPart( L"word", L"comments.xml", WordprocessingMLContentTypes::Comments, OpenXmlRelationshipTypes::Comments );
}
int OpenXmlPackage::RegisterCommentsExtended()
{
return AddPart( L"word", L"commentsExtended.xml", WordprocessingMLContentTypes::CommentsExtended, OpenXmlRelationshipTypes::CommentsExtended );
}
int OpenXmlPackage::AddCommentsPart( const std::wstring& fileName, const std::wstring& relationshipType, const std::wstring& targetMode )
{
CommentsRelationshipsFile.Relationships.push_back( Relationship( ( std::wstring( L"rId" ) + FormatUtils::IntToWideString( ++CommentsRelationshipsFile.RelID ) ), relationshipType, fileName, targetMode ) );

View File

@ -176,6 +176,7 @@ namespace DocFileFormat
int RegisterFootnotes();
int RegisterEndnotes();
int RegisterComments();
int RegisterCommentsExtended();
int RegisterImage ( const IMapping* mapping, Global::BlipType blipType );
int RegisterHyperlink ( const IMapping* mapping, const std::wstring& link);
int RegisterOLEObject ( const IMapping* mapping, const std::wstring& objectType );

View File

@ -104,32 +104,33 @@ namespace DocFileFormat
}
//append formatting of paragraph end mark
XMLTools::XMLElementPtr rPr = XMLTools::XMLElementPtr(XMLTools::XMLElementPtr(new XMLTools::XMLElement( L"w:rPr" )));
if ( _paraEndChpx != NULL )
{
XMLTools::XMLElement* rPr = new XMLTools::XMLElement( L"w:rPr" );
//append properties
RevisionData* rev = new RevisionData( _paraEndChpx );
CharacterPropertiesMapping* ccMapping = new CharacterPropertiesMapping( rPr, m_document, rev, papx, false );
CharacterPropertiesMapping* ccMapping = new CharacterPropertiesMapping( rPr.get(), m_document, rev, papx, false );
_paraEndChpx->Convert( ccMapping );
//append delete infos
if ( rev->Type == Deleted )
{
XMLTools::XMLElement del( L"w:del" );
XMLTools::XMLElement del( L"w:del" );
rPr->AppendChild( del );
}
if( rPr->GetChildCount() >0 )
if( rPr->GetChildCount() > 0 )
{
_pPr->AppendChild( *rPr );
_pPr->AppendChild( rPr );
}
RELEASEOBJECT( ccMapping );
RELEASEOBJECT( rev );
RELEASEOBJECT( rPr );
}
bool bNumPr = false;
std::list<SinglePropertyModifier>::iterator end = papx->grpprl->end();
for (std::list<SinglePropertyModifier>::iterator iter = papx->grpprl->begin(); iter != end; ++iter)
{
@ -426,7 +427,10 @@ namespace DocFileFormat
if (m_document->listTable)
{
unsigned short numId = m_document->listTable->appendNumbering( desc );
std::wstring sRPr;
if (rPr->GetChildCount() > 0) sRPr = rPr->GetXMLString();
unsigned short numId = m_document->listTable->appendNumbering( desc, sRPr );
appendValueElement( &numPr, L"numId", numId, true );
}
}break;
@ -439,8 +443,10 @@ namespace DocFileFormat
case sprmOldPNLvlAnm:
{
short level = FormatUtils::BytesToUChar( iter->Arguments, 0, iter->argumentsSize) - 1;
if (level > 0 && level < 10)
appendValueElement( _pPr, L"outlineLvl", level, false );
level = 0;
appendValueElement( &numPr, L"ilvl", level, true );
bNumPr = true;
}break;
case sprmOldPFNoLineNumb:
@ -456,25 +462,11 @@ namespace DocFileFormat
case sprmPIlfo:
{
//Если numbering.xml пустой, то не пищем свойство
//Todo разобраться с закоментированным кодом
if (NULL != m_document->listTable && false == m_document->listTable->listData.empty())
{
unsigned short numId = FormatUtils::BytesToUInt16( iter->Arguments, 0, iter->argumentsSize );
appendValueElement( &numPr, L"numId", numId, true );
}
//check if there is a ilvl reference, if not, check the count of LVLs.
//if only one LVL exists in the referenced list, create a hard reference to that LVL
//if (containsLvlReference(papx.grpprl) == false)
//{
// ListFormatOverride lfo = m_context.Doc.ListFormatOverrideTable[val];
// int index = NumberingMapping.FindIndexbyId(m_context.Doc.ListTable, lfo.lsid);
// ListData lst = m_context.Doc.ListTable[index];
// if (lst.rglvl.Length == 1)
// {
// appendValueElement(numPr, "ilvl", "0", true);
// }
//}
}
break;
@ -645,15 +637,18 @@ namespace DocFileFormat
}break;
}
}
//append frame properties
if ( numPr.GetChildCount() > 0 && ((bNumPr && m_document->nWordVersion > 0) || m_document->nWordVersion == 0))//append numPr
{//23.doc
_pPr->AppendChild( numPr );
}
if ( _framePr->GetAttributeCount() > 0 )
{
_pPr->AppendChild( *_framePr );
}
_isSectionPageBreak = 0;
//append section properties
if ( _sepx != NULL )
{
XMLTools::XMLElement sectPr( L"w:sectPr" );
@ -672,34 +667,27 @@ namespace DocFileFormat
_pPr->AppendChild( sectPr );
}
//append indent
if ( ind.GetAttributeCount() > 0 )
{
_pPr->AppendChild( ind );
}
if ( spacing.GetAttributeCount() > 0 )//append spacing
if ( spacing.GetAttributeCount() > 0 )
{
_pPr->AppendChild( spacing );
}
if ( jc ) //append justification
if ( jc )
{
_pPr->AppendChild( *jc );
RELEASEOBJECT( jc );
}
if ( numPr.GetChildCount() > 0 )//append numPr
{
_pPr->AppendChild( numPr );
}
if ( pBdr.GetChildCount() > 0 ) //append borders
if ( pBdr.GetChildCount() > 0 )
{
_pPr->AppendChild( pBdr );
}
//write Properties
if ( ( _pPr->GetChildCount() > 0 ) || ( _pPr->GetAttributeCount() > 0 ) )
{
m_pXmlWriter->WriteString( _pPr->GetXMLString() );

View File

@ -45,7 +45,7 @@
namespace ImageHelper
{
Global::_BlipType SaveImageToFileFromDIB(unsigned char* data, int size, const std::wstring& file_name)//without ext
Global::_BlipType SaveImageToFileFromDIB(unsigned char* data, int size, std::wstring& file_name)//without ext
{
Global::_BlipType result = Global::msoblipERROR;
@ -99,14 +99,21 @@ namespace ImageHelper
//if (header->biWidth % 2 != 0 && sz_bitmap < size -offset)
// header->biWidth++;
if (header->biClrUsed > 0)
{
oFrame.put_Palette((unsigned char*)data + offset, header->biClrUsed);
offset += header->biClrUsed * 4;
}
int stride = -(size - offset) / header->biHeight;
if (-stride >= header->biWidth && header->biBitCount >= 24)
if (-stride >= header->biWidth/* && header->biBitCount >= 24*/)
{
result = Global::msoblipPNG;
}
oFrame.put_Stride (stride/*header->biBitCount * header->biWidth /8*/);
oFrame.put_Stride(stride);
biSizeImage = header->biSizeImage > 0 ? header->biSizeImage : (size - offset);
}
@ -117,24 +124,28 @@ namespace ImageHelper
{
oFrame.put_Data((unsigned char*)data + offset);
if (!oFrame.SaveFile(file_name + L".png", 4/*CXIMAGE_FORMAT_PNG*/))
result = Global::msoblipERROR;
file_name += L".png";
if (!oFrame.SaveFile(file_name, 4/*CXIMAGE_FORMAT_PNG*/))
{
result = Global::msoblipDIB;
}
oFrame.put_Data(NULL);
}
else if (result == Global::msoblipWMF)
{
file_name += L".wmf";
NSFile::CFileBinary file;
if (file.CreateFileW(file_name + L".wmf"))
if (file.CreateFileW(file_name))
{
file.WriteFile((BYTE*)data, size);
file.CloseFile();
}
}
else if (biSizeImage > 0)
if (biSizeImage > 0 && result == Global::msoblipDIB)
{
file_name += L".bmp";
NSFile::CFileBinary file;
if (file.CreateFileW(file_name + L".bmp"))
if (file.CreateFileW(file_name))
{
_UINT16 vtType = 0x4D42; file.WriteFile((BYTE*)&vtType, 2);
_UINT32 dwLen = biSizeImage; file.WriteFile((BYTE*)&dwLen, 4);

View File

@ -162,6 +162,6 @@ namespace ImageHelper
_UINT16 bcBitCount;
};
Global::_BlipType SaveImageToFileFromDIB(unsigned char* data, int size, const std::wstring& file_name);
Global::_BlipType SaveImageToFileFromDIB(unsigned char* data, int size, std::wstring& file_name);
}

View File

@ -259,6 +259,12 @@ namespace DocFileFormat
//compatibility settings
m_oXmlWriter.WriteNodeBegin( L"w:compat" );
m_oXmlWriter.WriteNodeBegin( L"w:compatSetting", TRUE);
m_oXmlWriter.WriteAttribute( L"w:name", L"compatibilityMode" );
m_oXmlWriter.WriteAttribute( L"w:uri", L"http://schemas.microsoft.com/office/word" );
m_oXmlWriter.WriteAttribute( L"w:val", L"11" );
m_oXmlWriter.WriteNodeEnd( L"", TRUE );
//some settings must always be written
if ( dop->fUseNormalStyleForList )

View File

@ -55,32 +55,45 @@ namespace DocFileFormat
std::vector<ByteStructure*> Data;
std::vector<unsigned char*> DataExtra;
int code_page;
public:
virtual ~StringTable()
{
for ( std::vector<ByteStructure*>::iterator iter = this->Data.begin(); iter != this->Data.end(); iter++ )
for ( size_t i = 0; i < this->Data.size(); ++i )
{
RELEASEOBJECT( *iter );
RELEASEOBJECT( this->Data[i] );
if (false == this->DataExtra.empty())
{
if (this->DataExtra[i])
{
delete []this->DataExtra[i];
this->DataExtra[i] = NULL;
}
}
}
}
StringTable( VirtualStreamReader *reader, int code_page_ ):
code_page(code_page_), fExtend(false), cbData(0), cbExtra(0)
code_page(code_page_), fExtend(false), cbData(0), cbExtra(0), DataExtra(NULL)
{
parse( reader, (unsigned int)reader->GetPosition() );
parse( reader, (unsigned int)reader->GetPosition(), 0, false );
}
StringTable( POLE::Stream* tableStream, unsigned int fc, unsigned int lcb, int nWordVersion ) :
code_page(1250), fExtend(false), cbData(0), cbExtra(0)
StringTable( POLE::Stream* tableStream, unsigned int fc, unsigned int lcb, int nWordVersion, bool bReadExta = false) :
code_page(1250), fExtend(false), cbData(0), cbExtra(0), DataExtra(NULL)
{
if ( lcb > 0 )
{
VirtualStreamReader reader( tableStream, fc, nWordVersion);
parse( &reader, fc, lcb ) ;
parse( &reader, fc, lcb, bReadExta ) ;
}
}
std::vector<unsigned char*> & getDataExtra() {return DataExtra;}
unsigned short getDataExtraSize() {return cbExtra;}
ByteStructure* operator [] ( size_t index ) const
{
@ -96,7 +109,7 @@ namespace DocFileFormat
private:
void parse( VirtualStreamReader *reader, unsigned int fc, unsigned int lcb = 0 )
void parse( VirtualStreamReader *reader, unsigned int fc, unsigned int lcb = 0, bool bReadExta = false )
{
if ( reader == NULL ) return;
if (fc > reader->GetSize()) return;
@ -191,8 +204,15 @@ namespace DocFileFormat
reader->Seek( (int)( posBeforeType + cbData ), 0/*STREAM_SEEK_SET */);
reader->ReadBytes( cbExtra, false );//skip the extra unsigned char
if (bReadExta)
{
unsigned char* pData = reader->ReadBytes( cbExtra, true );
DataExtra.push_back(pData);
}
else
{
reader->ReadBytes( cbExtra, false );
}
}
}
};

View File

@ -354,7 +354,7 @@ namespace DocFileFormat
int nComputedCellWidthsGrid = 0;
for (size_t ccc = 0; ccc <= _gridIndex; ccc++)
for (size_t ccc = 0; ccc < _grid->size() && ccc <= _gridIndex; ccc++)
{
nComputedCellWidthsGrid += _grid->at(ccc);
}

View File

@ -336,7 +336,7 @@ namespace DocFileFormat
}
}
}break;
case metroBlob:
case ODRAW::metroBlob:
{//встроенная неведомая хуйня
ODRAW::MetroBlob* blob = dynamic_cast<ODRAW::MetroBlob*>(iter.get());
if (blob)
@ -350,28 +350,28 @@ namespace DocFileFormat
}
}break;
//BORDERS
case borderBottomColor:
case ODRAW::borderBottomColor:
if (!pict->brcBottom)
{
RGBColor bottomColor( (int)iter->op, RedFirst );
m_pXmlWriter->WriteAttribute( L"o:borderbottomcolor", L"#" + bottomColor.SixDigitHexCode);
}
break;
case borderLeftColor:
case ODRAW::borderLeftColor:
if (!pict->brcLeft)
{
RGBColor leftColor( (int)iter->op, RedFirst );
m_pXmlWriter->WriteAttribute( L"o:borderleftcolor", L"#" + leftColor.SixDigitHexCode);
}
break;
case borderRightColor:
case ODRAW::borderRightColor:
if (!pict->brcRight)
{
RGBColor rightColor( (int)iter->op, RedFirst );
m_pXmlWriter->WriteAttribute( L"o:borderrightcolor", L"#" + rightColor.SixDigitHexCode);
}
break;
case borderTopColor:
case ODRAW::borderTopColor:
if (!pict->brcTop)
{
RGBColor topColor( (int)iter->op, RedFirst );
@ -379,28 +379,28 @@ namespace DocFileFormat
}
break;
//CROPPING
case cropFromBottom:
case ODRAW::cropFromBottom:
{
//cast to signed integer
int cropBottom = (int)iter->op;
appendValueAttribute(m_imageData, L"cropbottom", FormatUtils::IntToWideString( cropBottom ) + L"f" );
}
break;
case cropFromLeft:
case ODRAW::cropFromLeft:
{
//cast to signed integer
int cropLeft = (int)iter->op;
appendValueAttribute(m_imageData, L"cropleft", FormatUtils::IntToWideString( cropLeft ) + L"f" );
}
break;
case cropFromRight:
case ODRAW::cropFromRight:
{
//cast to signed integer
int cropRight = (int)iter->op;
appendValueAttribute(m_imageData, L"cropright", FormatUtils::IntToWideString( cropRight ) + L"f" );
}
break;
case cropFromTop:
case ODRAW::cropFromTop:
{
//cast to signed integer
int cropTop = (int)iter->op;
@ -408,7 +408,7 @@ namespace DocFileFormat
}
break;
//------------------------------------------------------------
case PropertyId_rotation:
case ODRAW::ePropertyId_rotation:
{
double dAngle = (double)((int)iter->op) / 65535.0;
@ -420,23 +420,23 @@ namespace DocFileFormat
appendStyleProperty(strStyle, L"rotation", FormatUtils::DoubleToWideString(dAngle));
}break;
case posh:
case ODRAW::posh:
{
appendStyleProperty(strStyle, L"mso-position-horizontal", VMLShapeMapping::mapHorizontalPosition((PositionHorizontal)iter->op));
}break;
case posrelh:
case ODRAW::posrelh:
{
appendStyleProperty(strStyle, L"mso-position-horizontal-relative", VMLShapeMapping::mapHorizontalPositionRelative((PositionHorizontalRelative)iter->op));
}break;
case posv:
case ODRAW::posv:
{
appendStyleProperty(strStyle, L"mso-position-vertical", VMLShapeMapping::mapVerticalPosition((PositionVertical)iter->op));
}break;
case posrelv:
case ODRAW::posrelv:
{
appendStyleProperty(strStyle, L"mso-position-vertical-relative", VMLShapeMapping::mapVerticalPositionRelative((PositionVerticalRelative)iter->op));
}break;
case groupShapeBooleans:
case ODRAW::groupShapeBooleanProperties:
{
ODRAW::GroupShapeBooleanProperties* booleans = dynamic_cast<ODRAW::GroupShapeBooleanProperties*>(iter.get());
@ -559,8 +559,8 @@ namespace DocFileFormat
pict->embeddedData = newData;
}
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(Global::msoblipDIB),
pict->embeddedData, pict->embeddedDataSize, Global::msoblipDIB));
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(btWin32),
pict->embeddedData, pict->embeddedDataSize, btWin32));
m_nImageId = m_context->_docx->RegisterImage(m_caller, btWin32);
result = true;
@ -589,22 +589,20 @@ namespace DocFileFormat
BitmapBlip* bitBlip = static_cast<BitmapBlip*>(oBlipEntry->Blip);
if (bitBlip)
{
std::wstring file_name = m_context->_doc->m_sTempFolder + L"tmp_image";
std::wstring file_name = m_context->_doc->m_sTempFolder + FILE_SEPARATOR_STR + 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))
{
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;
}
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32),
boost::shared_array<unsigned char>(pData), nData, oBlipEntry->btWin32));
break;
}
}
}//в случае ошибки конвертации -храним оригинальный dib
}
case Global::msoblipJPEG:
case Global::msoblipCMYKJPEG:
case Global::msoblipPNG:

View File

@ -141,7 +141,9 @@ namespace DocFileFormat
m_pXmlWriter->WriteNodeBegin( L"v:group", true );
m_pXmlWriter->WriteAttribute( L"id", m_shapeId);
m_pXmlWriter->WriteAttribute( L"style", FormatUtils::XmlEncode(buildStyle(shape, anchor, options, container->Index)));
bool twistDimensions = false;
m_pXmlWriter->WriteAttribute( L"style", FormatUtils::XmlEncode(buildStyle(shape, anchor, options, container->Index, twistDimensions)));
m_pXmlWriter->WriteAttribute( L"coordorigin", ( FormatUtils::IntToWideString(gsr->rcgBounds.topLeftAngle.x) + L"," + FormatUtils::IntToWideString( gsr->rcgBounds.topLeftAngle.y)));
m_pXmlWriter->WriteAttribute( L"coordsize", ( FormatUtils::IntToWideString(gsr->rcgBounds.size.cx) + L"," + FormatUtils::IntToWideString(gsr->rcgBounds.size.cy)));
@ -150,7 +152,7 @@ namespace DocFileFormat
{
switch (options[i]->opid)
{
case pWrapPolygonVertices:
case ODRAW::pWrapPolygonVertices:
{
std::wstring wrapCoords = GetWrapCoords(options[i]);
if (!wrapCoords.empty())
@ -237,18 +239,19 @@ namespace DocFileFormat
if ( !pShape->fBackground )
{
bool twistDimensions = false;
if (pShape->GetShapeType())
{
freeform = false;
m_pXmlWriter->WriteAttribute( L"type", (std::wstring(L"#") + VMLShapeTypeMapping::GenerateTypeId(pShape->GetShapeType())));
}
m_pXmlWriter->WriteAttribute( L"style", FormatUtils::XmlEncode(buildStyle(pShape, pAnchor, options, pContainer->m_nIndex)));
m_pXmlWriter->WriteAttribute( L"style", FormatUtils::XmlEncode(buildStyle(pShape, pAnchor, options, pContainer->m_nIndex, twistDimensions)));
if (pShape->is<LineType>())
{
//append "from" and "to" attributes
m_pXmlWriter->WriteAttribute(L"from", GetLineFrom(pAnchor));
m_pXmlWriter->WriteAttribute(L"to", GetLineTo(pAnchor));
m_pXmlWriter->WriteAttribute(L"from", GetLineFrom(pAnchor, twistDimensions));
m_pXmlWriter->WriteAttribute(L"to", GetLineTo(pAnchor, twistDimensions));
}
if (m_isBullete)
@ -304,7 +307,7 @@ namespace DocFileFormat
switch (iter->opid)
{
//BOOLEANS
case geometryBooleans:
case ODRAW::geometryBooleanProperties:
{
ODRAW::GeometryBooleanProperties *booleans = dynamic_cast<ODRAW::GeometryBooleanProperties*>(iter.get());
if (booleans->fUsefLineOK && !booleans->fLineOK)
@ -325,7 +328,7 @@ namespace DocFileFormat
}
}
break;
case fillStyleBooleanProperties:
case ODRAW::fillStyleBooleanProperties:
{
ODRAW::FillStyleBooleanProperties *booleans = dynamic_cast<ODRAW::FillStyleBooleanProperties *>(iter.get());
if (booleans->fUsefFilled && !booleans->fFilled)
@ -338,7 +341,7 @@ namespace DocFileFormat
appendValueAttribute(&m_fill, L"rotate", L"t");
}
}break;
case lineStyleBooleans:
case ODRAW::lineStyleBooleanProperties:
{
ODRAW::LineStyleBooleanProperties *booleans = dynamic_cast<ODRAW::LineStyleBooleanProperties *>(iter.get());
if (booleans->fUsefLine && !booleans->fLine)
@ -347,16 +350,16 @@ namespace DocFileFormat
}
}
break;
case protectionBooleans:
case ODRAW::protectionBooleanProperties:
{
//ProtectionBooleanProperties booleans(iter->op);
}
break;
case diagramBooleans:
case ODRAW::diagramBooleanProperties:
{
}
break;
case groupShapeBooleans:
case ODRAW::groupShapeBooleanProperties:
{
ODRAW::GroupShapeBooleanProperties *booleans = dynamic_cast<ODRAW::GroupShapeBooleanProperties *>(iter.get());
if (booleans->fUsefLayoutInCell)
@ -366,78 +369,78 @@ namespace DocFileFormat
}
break;
// GEOMETRY
case shapePath :
case ODRAW::shapePath :
{
bHavePath = true;
nShapePath = iter->op;
}break;
case pVertices:
case ODRAW::pVertices:
{
opVerticles = iter;
}break;
case pSegmentInfo:
case ODRAW::pSegmentInfo:
{
opSegmentInfo = iter;
}break;
case pGuides:
case ODRAW::pGuides:
{
GetGuides(iter);
}break;
case pConnectionSites:
case ODRAW::pConnectionSites:
{
opConnectLocs = iter;
}break;
case pConnectionSitesDir:
case ODRAW::pConnectionSitesDir:
{
opConnectAngles = iter;
}break;
case pInscribe:
case ODRAW::pInscribe:
{
opInscribe = iter;
}break;
case adjustValue:
case ODRAW::adjustValue:
{
m_nAdjValues[0] = (int)iter->op;
nAdjValues = (std::max)(nAdjValues,1);
}
break;
case adjust2Value:
case ODRAW::adjust2Value:
{
m_nAdjValues[1] = (int)iter->op;
nAdjValues = (std::max)(nAdjValues, 2);
}
break;
case adjust3Value:
case ODRAW::adjust3Value:
{
m_nAdjValues[2] = (int)iter->op;
nAdjValues =(std::max)(nAdjValues, 3);
}break;
case adjust4Value:
case ODRAW::adjust4Value:
{
m_nAdjValues[3] = (int)iter->op;
nAdjValues = (std::max)(nAdjValues, 4);
}break;
case adjust5Value:
case ODRAW::adjust5Value:
{
m_nAdjValues[4] = (int)iter->op;
nAdjValues = (std::max)(nAdjValues, 5);
}break;
case adjust6Value:
case ODRAW::adjust6Value:
{
m_nAdjValues[5] = (int)iter->op;
nAdjValues = (std::max)(nAdjValues, 6);
}break;
case adjust7Value:
case ODRAW::adjust7Value:
{
m_nAdjValues[6] = (int)iter->op;
nAdjValues = (std::max)(nAdjValues, 7);
}break;
case adjust8Value:
case ODRAW::adjust8Value:
{
m_nAdjValues[7] = (int)iter->op;
nAdjValues = (std::max)(nAdjValues, 8);
}break;
case pWrapPolygonVertices:
case ODRAW::pWrapPolygonVertices:
{
std::wstring wrapCoords = GetWrapCoords(iter);
@ -446,22 +449,22 @@ namespace DocFileFormat
m_pXmlWriter->WriteAttribute( L"wrapcoords", wrapCoords);
}
}break;
case geoRight:
case ODRAW::geoRight:
{
xCoord = iter->op;
}break;
case geoBottom:
case ODRAW::geoBottom:
{
yCoord = iter->op;
}break;
// LINE
case lineColor:
case ODRAW::lineColor:
{
RGBColor lineColor((int)iter->op, RedFirst);
if ( !pShape->fBackground )
m_pXmlWriter->WriteAttribute( L"strokecolor", (std::wstring(L"#") + lineColor.SixDigitHexCode));
}break;
case lineWidth:
case ODRAW::lineWidth:
{
if (iter->op > 0)
{
@ -469,39 +472,39 @@ namespace DocFileFormat
m_pXmlWriter->WriteAttribute(L"strokeweight", FormatUtils::DoubleToWideString(eLineWidth.ToPoints()) + L"pt");
}
}break;
case lineDashing:
case ODRAW::lineDashing:
{
appendValueAttribute(&m_stroke, L"dashstyle", FormatUtils::MapValueToWideString( iter->op, &Global::DashStyleMap[0][0], 11, 16 ) );
}break;
case lineStyle:
case ODRAW::lineStyle:
{
appendValueAttribute(&m_stroke, L"linestyle", getLineStyle( iter->op ));
}break;
case lineEndArrowhead:
case ODRAW::lineEndArrowhead:
{
appendValueAttribute(&m_stroke, L"endarrow", getArrowStyle( iter->op ));
}break;
case lineEndArrowLength:
case ODRAW::lineEndArrowLength:
{
appendValueAttribute(&m_stroke, L"endarrowlength", getArrowLength( iter->op ));
}break;
case lineEndArrowWidth:
case ODRAW::lineEndArrowWidth:
{
appendValueAttribute(&m_stroke, L"endarrowwidth", getArrowWidth( iter->op ));
}break;
case lineStartArrowhead:
case ODRAW::lineStartArrowhead:
{
appendValueAttribute(&m_stroke, L"startarrow", getArrowStyle( iter->op ));
}break;
case lineStartArrowLength:
case ODRAW::lineStartArrowLength:
{
appendValueAttribute(&m_stroke, L"startarrowlength", getArrowLength( iter->op ));
}break;
case lineStartArrowWidth:
case ODRAW::lineStartArrowWidth:
{
appendValueAttribute(&m_stroke, L"startarrowwidth", getArrowWidth( iter->op ));
}break;
case cxstyle:
case ODRAW::cxstyle:
{
if (pShape->GetShapeType() == NULL)
{
@ -517,39 +520,39 @@ namespace DocFileFormat
}
}break;
// FILL
case fillColor:
case ODRAW::fillColor:
{
RGBColor fillColor((int)iter->op, RedFirst);
m_pXmlWriter->WriteAttribute(L"fillcolor", ( std::wstring( L"#" ) + fillColor.SixDigitHexCode ));
}break;
case fillBackColor:
case ODRAW::fillBackColor:
{
RGBColor fillBackColor( (int)iter->op, RedFirst );
appendValueAttribute(&m_fill, L"color2", ( std::wstring( L"#" ) + fillBackColor.SixDigitHexCode ));
}break;
case fillAngle:
case ODRAW::fillAngle:
{
ODRAW::FixedPoint* point = dynamic_cast<ODRAW::FixedPoint*>(iter.get());
if (point) appendValueAttribute(&m_fill, L"angle", FormatUtils::DoubleToWideString( point->dVal ));
}break;
case fillShadeType:
case ODRAW::fillShadeType:
{
appendValueAttribute(&m_fill, L"method", getFillMethod( iter->op ));
}break;
case fillShadeColors:
case ODRAW::fillShadeColors:
{
appendValueAttribute(&m_fill, L"colors", getFillColorString( iter ));
}break;
case fillFocus:
case ODRAW::fillFocus:
{
appendValueAttribute(&m_fill, L"focus", ( FormatUtils::IntToWideString( iter->op ) + L"%" ));
appendValueAttribute(&m_fill, L"focussize", L"");
}break;
case fillType:
case ODRAW::fillType:
{
appendValueAttribute(&m_fill, L"type", getFillType( iter->op ));
}break;
case fillBlip:
case ODRAW::fillBlip:
{
BlipStoreEntry* pFillBlip = NULL;
@ -570,76 +573,76 @@ namespace DocFileFormat
bPicturePresent = true;
}break;
case fillBlipName:
case ODRAW::fillBlipName:
{
ODRAW::AnyString* str = dynamic_cast<ODRAW::AnyString*>(iter.get());
if ((str) && (!str->string_.empty()))
{
appendValueAttribute(&m_fill, L"o:title", FormatUtils::XmlEncode(str->string_));
appendValueAttribute(&m_fill, L"o:title", str->string_);
}
}break;
case fillOpacity:
case ODRAW::fillOpacity:
{
appendValueAttribute(&m_fill, L"opacity", ( FormatUtils::IntToWideString( iter->op ) + L"f" ));
}
break;
case fillBackOpacity:
case ODRAW::fillBackOpacity:
{
appendValueAttribute(&m_fill, L"o:opacity2", (FormatUtils::IntToWideString(iter->op) + L"f"));
}break;
// SHADOW
case shadowType:
case ODRAW::shadowType:
{
appendValueAttribute(&m_shadow, L"type", getShadowType(iter->op));
}break;
case shadowColor:
case ODRAW::shadowColor:
{
RGBColor shadowColor((int)iter->op, RedFirst);
appendValueAttribute(&m_shadow, L"color", ( std::wstring( L"#" ) + shadowColor.SixDigitHexCode ));
}break;
case shadowOffsetX:
case ODRAW::shadowOffsetX:
{
ShadowOffsetX = EmuValue( (int)iter->op );
}break;
case shadowSecondOffsetX:
case ODRAW::shadowSecondOffsetX:
{
SecondShadowOffsetX = EmuValue( (int)iter->op );
}break;
case shadowOffsetY:
case ODRAW::shadowOffsetY:
{
ShadowOffsetY = EmuValue( (int)iter->op );
}break;
case shadowSecondOffsetY:
case ODRAW::shadowSecondOffsetY:
{
SecondShadowOffsetY = EmuValue( (int)iter->op );
}break;
case shadowOriginX:
case ODRAW::shadowOriginX:
{
ShadowOriginX = ( iter->op / pow( (double)2, (double)16 ) );
}break;
case shadowOriginY:
case ODRAW::shadowOriginY:
{
ShadowOriginY = (iter->op / pow( (double)2, (double)16));
}break;
case shadowOpacity:
case ODRAW::shadowOpacity:
{
double shadowOpa = (iter->op / pow( (double)2, (double)16));
appendValueAttribute(&m_shadow, L"opacity", FormatUtils::DoubleToFormattedWideString( shadowOpa, L"%.2f" ));
}break;
case shadowStyleBooleanProperties:
case ODRAW::shadowStyleBooleanProperties:
{
//ODRAW::ShadowStyleBooleanProperties
}break;
// OLE
case pictureId:
case ODRAW::pictureId:
{
indexOLE = iter->op;
}break;
// PICTURE
case Pib:
case ODRAW::pib:
{
int index = (int)( iter->op - 1 );
@ -653,101 +656,101 @@ namespace DocFileFormat
}
bPicturePresent = true;
}break;
case pibName:
case ODRAW::pibName:
{
ODRAW::AnyString* str = dynamic_cast<ODRAW::AnyString*>(iter.get());
if ((str) && (!str->string_.empty()))
{
appendValueAttribute(&m_imagedata, L"o:title", FormatUtils::XmlEncode(str->string_));
appendValueAttribute(&m_imagedata, L"o:title", str->string_);
}
}break;
// 3D STYLE
case threeDStyleBooleanProperties:
case ODRAW::threeDStyleBooleanProperties:
{
ODRAW::ThreeDStyleBooleanProperties* booleans = dynamic_cast<ODRAW::ThreeDStyleBooleanProperties*>(iter.get());
}break;
case threeDObjectBooleanProperties:
case ODRAW::threeDObjectBooleanProperties:
{
ODRAW::ThreeDObjectBooleanProperties* booleans = dynamic_cast<ODRAW::ThreeDObjectBooleanProperties*>(iter.get());
if ((booleans) && (booleans->fUsef3D && !booleans->f3D))
b3D = false;
}break;
case c3DRenderMode:
case ODRAW::c3DRenderMode:
{
}break;
case c3DExtrudeBackward:
case ODRAW::c3DExtrudeBackward:
{
EmuValue backwardValue( (int)iter->op );
std::wstring depth = FormatUtils::DoubleToWideString( backwardValue.ToPoints() ) + L"pt";
appendValueAttribute(&m_3dstyle, L"backdepth", depth);
}break;
case c3DAmbientIntensity:
case ODRAW::c3DAmbientIntensity:
{
std::wstring intens = FormatUtils::IntToWideString((int)iter->op) + L"f";
appendValueAttribute(&m_3dstyle, L"brightness", intens);
}break;
case c3DSpecularAmt:
case ODRAW::c3DSpecularAmt:
{
std::wstring amt = FormatUtils::IntToWideString((int)iter->op) + L"f";
appendValueAttribute(&m_3dstyle, L"specularity", amt);
}break;
case c3DDiffuseAmt:
case ODRAW::c3DDiffuseAmt:
{
std::wstring amt = FormatUtils::IntToWideString((int)iter->op) + L"f";
appendValueAttribute(&m_3dstyle, L"diffusity", amt);
}break;
case c3DKeyIntensity:
case ODRAW::c3DKeyIntensity:
{
std::wstring amt = FormatUtils::IntToWideString((int)iter->op);
appendValueAttribute(&m_3dstyle, L"lightlevel", amt);
}break;
case c3DExtrusionColor:
case ODRAW::c3DExtrusionColor:
{
std::wstring color = FormatUtils::IntToFormattedWideString(iter->op, L"#%06x");
appendValueAttribute(&m_3dstyle, L"color", color);
}break;
case c3DSkewAngle:
case ODRAW::c3DSkewAngle:
{
ODRAW::FixedPoint* point = dynamic_cast<ODRAW::FixedPoint*>(iter.get());
if (point) appendValueAttribute(&m_3dstyle, L"skewangle", FormatUtils::DoubleToWideString( point->dVal ));
}break;
case c3DXViewpoint:
case ODRAW::c3DXViewpoint:
{
ODRAW::FixedPoint* point = dynamic_cast<ODRAW::FixedPoint*>(iter.get());
if (point) ViewPointX = EmuValue( (int)point->dVal );
}break;
case c3DYViewpoint:
case ODRAW::c3DYViewpoint:
{
ODRAW::FixedPoint* point = dynamic_cast<ODRAW::FixedPoint*>(iter.get());
if (point) ViewPointY = EmuValue( (int)point->dVal );
}break;
case c3DZViewpoint:
case ODRAW::c3DZViewpoint:
{
ODRAW::FixedPoint* point = dynamic_cast<ODRAW::FixedPoint*>(iter.get());
if (point) ViewPointZ = EmuValue( (int)point->dVal );
}break;
case c3DOriginX:
case ODRAW::c3DOriginX:
{
ODRAW::FixedPoint* point = dynamic_cast<ODRAW::FixedPoint*>(iter.get());
if (point) viewPointOriginX = point->dVal;
}break;
case c3DOriginY:
case ODRAW::c3DOriginY:
{
ODRAW::FixedPoint* point = dynamic_cast<ODRAW::FixedPoint*>(iter.get());
if (point) viewPointOriginY = point->dVal;
}break;
// TEXTBOX
case lTxid:
case ODRAW::lTxid:
{
hasTextbox = true;
nLTxID = (((iter->op) >> 16) & 0xFFFF);
}break;
case dxTextLeft: {ndxTextLeft = (int)iter->op; break;}
case dyTextTop: {ndyTextTop = (int)iter->op; break;}
case dxTextRight: {ndxTextRight = (int)iter->op; break;}
case dyTextBottom: {ndyTextBottom = (int)iter->op; break;}
case txflTextFlow:
case ODRAW::dxTextLeft: {ndxTextLeft = (int)iter->op; break;}
case ODRAW::dyTextTop: {ndyTextTop = (int)iter->op; break;}
case ODRAW::dxTextRight: {ndxTextRight = (int)iter->op; break;}
case ODRAW::dyTextBottom: {ndyTextBottom = (int)iter->op; break;}
case ODRAW::txflTextFlow:
{
switch(iter->op)
{
@ -755,6 +758,7 @@ namespace DocFileFormat
case 4://обычный
break;
case 1:
case 3:
case 5://верт (склони голову направо)
appendStyleProperty(sTextboxStyle, L"layout-flow", L"vertical");
break;
@ -765,49 +769,33 @@ namespace DocFileFormat
}
}break;
// Word Art
case gtextUNICODE:
case ODRAW::gtextUNICODE:
{
ODRAW::AnyString* str = dynamic_cast<ODRAW::AnyString*>(iter.get());
if ((str) && (!str->string_.empty()))
{
std::wstring text = FormatUtils::XmlEncode(str->string_);
if (std::wstring::npos != text.find(L"\n"))
{
m_textpath.AppendText(text);
}
text = ReplaceString(text, L"\n", L"&#xA;");
appendValueAttribute(&m_textpath, L"string", text);
appendValueAttribute(&m_textpath, L"string", str->string_);
}
}break;
case gtextFont:
case ODRAW::gtextFont:
{
ODRAW::AnyString* str = dynamic_cast<ODRAW::AnyString*>(iter.get());
if ((str) && (!str->string_.empty()))
if (str)
{
std::wstring font = str->string_;
size_t i = font.size();
while (i > 0)
{
if (font[i-1] != 0) break;
i--;
}
if (i < font.size()) font.erase(font.begin() + i, font.end());
font = std::wstring(L"\"") + font + std::wstring(L"\"");
appendStyleProperty(m_textPathStyle, L"font-family", font);
appendStyleProperty(m_textPathStyle, L"font-family", str->string_);
}
}break;
case gtextSize:
case ODRAW::gtextSize:
{
std::wstring fontSize = FormatUtils::IntToWideString(iter->op/65535);
appendStyleProperty(m_textPathStyle, L"font-size", fontSize + L"pt");
}break;
case gtextSpacing:
case ODRAW::gtextSpacing:
{
std::wstring spacing = FormatUtils::IntToWideString(iter->op);
appendStyleProperty(m_textPathStyle, L"v-text-spacing", spacing + L"f");
}break;
case geometryTextBooleanProperties:
case ODRAW::geometryTextBooleanProperties:
{
ODRAW::GeometryTextBooleanProperties *props = dynamic_cast<ODRAW::GeometryTextBooleanProperties*>(iter.get());
if (props->fUsegFBestFit && props->fBestFit)
@ -1215,7 +1203,7 @@ namespace DocFileFormat
return strXmlAttr;
}
std::wstring VMLShapeMapping::GetLineFrom(const ChildAnchor* pAnchor) const
std::wstring VMLShapeMapping::GetLineFrom(const ChildAnchor* pAnchor, bool twistDimensions) const
{
//Если линия находится в группе, то координаты должны быть в Twips
//Если линия находится в группе, то координаты должны быть в других единицах измерения (например в twips)
@ -1224,15 +1212,33 @@ namespace DocFileFormat
if (NULL != pAnchor)
{
strXmlFrom += FormatUtils::IntToWideString(pAnchor->rcgBounds.topLeftAngle.x);
int left = pAnchor->rcgBounds.topLeftAngle.x;
int top = pAnchor->rcgBounds.topLeftAngle.y;
if (twistDimensions)
{
int right = pAnchor->rcgBounds.topLeftAngle.x + pAnchor->rcgBounds.size.cx;
int bottom = pAnchor->rcgBounds.topLeftAngle.y + pAnchor->rcgBounds.size.cy;
left = (right + pAnchor->rcgBounds.topLeftAngle.x) * 0.5 - (bottom - pAnchor->rcgBounds.topLeftAngle.y) * 0.5;
top = (bottom + pAnchor->rcgBounds.topLeftAngle.y) * 0.5 - (right - pAnchor->rcgBounds.topLeftAngle.x) * 0.5;
}
strXmlFrom += FormatUtils::IntToWideString(left);
strXmlFrom += L",";
strXmlFrom += FormatUtils::IntToWideString(pAnchor->rcgBounds.topLeftAngle.y);
strXmlFrom += FormatUtils::IntToWideString(top);
}
else if (m_pSpa)
{
TwipsValue oLeft(m_pSpa->xaLeft);
TwipsValue oTop(m_pSpa->yaTop);
if (twistDimensions)
{
oLeft = TwipsValue((m_pSpa->xaRight + m_pSpa->xaLeft) * 0.5 - (m_pSpa->yaBottom - m_pSpa->yaTop) * 0.5);
oTop = TwipsValue((m_pSpa->yaBottom + m_pSpa->yaTop) * 0.5 - (m_pSpa->xaRight - m_pSpa->xaLeft) * 0.5);
}
strXmlFrom += FormatUtils::DoubleToWideString(oLeft.ToPoints());
strXmlFrom += L"pt,";
strXmlFrom += FormatUtils::DoubleToWideString(oTop.ToPoints());
@ -1242,7 +1248,7 @@ namespace DocFileFormat
return strXmlFrom;
}
std::wstring VMLShapeMapping::GetLineTo(const ChildAnchor* pAnchor) const
std::wstring VMLShapeMapping::GetLineTo(const ChildAnchor* pAnchor, bool twistDimensions) const
{
//Если линия находится в группе, то координаты должны быть в других единицах измерения (например в twips)
@ -1250,15 +1256,32 @@ namespace DocFileFormat
if (NULL != pAnchor)
{
strXmlTo += FormatUtils::IntToWideString(pAnchor->rcgBounds.topLeftAngle.x + pAnchor->rcgBounds.size.cx);
int right = pAnchor->rcgBounds.topLeftAngle.x + pAnchor->rcgBounds.size.cx;
int bottom = pAnchor->rcgBounds.topLeftAngle.y + pAnchor->rcgBounds.size.cy;
if (twistDimensions)
{
int left = (right + pAnchor->rcgBounds.topLeftAngle.x) * 0.5 - (bottom - pAnchor->rcgBounds.topLeftAngle.y) * 0.5;
int top = (bottom + pAnchor->rcgBounds.topLeftAngle.y) * 0.5 - (right - pAnchor->rcgBounds.topLeftAngle.x) * 0.5;
right = left + pAnchor->rcgBounds.size.cy;
bottom = top + pAnchor->rcgBounds.size.cx;
}
strXmlTo += FormatUtils::IntToWideString(right);
strXmlTo += L",";
strXmlTo += FormatUtils::IntToWideString(pAnchor->rcgBounds.topLeftAngle.y + pAnchor->rcgBounds.size.cy);
strXmlTo += FormatUtils::IntToWideString(bottom);
}
else if (m_pSpa)
{
TwipsValue oRight (m_pSpa->xaRight);
TwipsValue oBottom (m_pSpa->yaBottom);
if (twistDimensions)
{
oRight = TwipsValue((m_pSpa->yaBottom - m_pSpa->yaTop) + (m_pSpa->xaRight + m_pSpa->xaLeft) * 0.5 - (m_pSpa->yaBottom - m_pSpa->yaTop) * 0.5);
oBottom = TwipsValue((m_pSpa->xaRight - m_pSpa->xaLeft) + (m_pSpa->yaBottom + m_pSpa->yaTop) * 0.5 - (m_pSpa->xaRight - m_pSpa->xaLeft) * 0.5);
}
strXmlTo += FormatUtils::DoubleToWideString(oRight.ToPoints());
strXmlTo += L"pt,";
strXmlTo += FormatUtils::DoubleToWideString(oBottom.ToPoints());
@ -1322,12 +1345,11 @@ namespace DocFileFormat
{
boost::shared_array<unsigned char> arDecompressed(decompressed);
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlip->btWin32), arDecompressed, decompressedSize));
result = true;
}
RELEASEOBJECT(metaBlip);
}
}
break;
}break;
case Global::msoblipJPEG:
case Global::msoblipCMYKJPEG:
case Global::msoblipPNG:
@ -1341,38 +1363,35 @@ namespace DocFileFormat
{
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 = ImageHelper::SaveImageToFileFromDIB(bitBlip->m_pvBits, bitBlip->pvBitsSize, file_name);
unsigned char* pData = NULL;
DWORD nData = 0;
if (NSFile::CFileBinary::ReadAllBytes(file_name, &pData, nData))
{
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;
}
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlip->btWin32),
boost::shared_array<unsigned char>(pData), nData, oBlip->btWin32));
result = true;
break;
}//в случае ошибки конвертации -храним оригинальный dib
}
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlip->btWin32),
bitBlip->m_pvBits, bitBlip->pvBitsSize, oBlip->btWin32));
RELEASEOBJECT (bitBlip);
}
}break;
result = true;
}break;
}
default:
{
result = false;
return result;
}
break;
}
m_nImageId = m_context->_docx->RegisterImage (m_pCaller, oBlip->btWin32);
result = true;
}
if (result)
{
m_nImageId = m_context->_docx->RegisterImage (m_pCaller, oBlip->btWin32);
}
return result;
}
@ -1613,26 +1632,26 @@ namespace DocFileFormat
switch (iter->opid)
{
// POSITIONING
case posh:
case ODRAW::posh:
{
nPosH = iter->op;
}break;
case posrelh:
case ODRAW::posrelh:
{
nRelH = iter->op;
appendStyleProperty(oStyle, L"mso-position-horizontal-relative", mapHorizontalPositionRelative((PositionHorizontalRelative)iter->op));
}break;
case posv:
case ODRAW::posv:
{
nPosV = iter->op;
}break;
case posrelv:
case ODRAW::posrelv:
{
nRelV = iter->op;
appendStyleProperty(oStyle, L"mso-position-vertical-relative", mapVerticalPositionRelative((PositionVerticalRelative)iter->op));
}break;
// BOOLEANS
case groupShapeBooleans:
case ODRAW::groupShapeBooleanProperties:
{
ODRAW::GroupShapeBooleanProperties* booleans = dynamic_cast<ODRAW::GroupShapeBooleanProperties*>(iter.get());
@ -1660,7 +1679,7 @@ namespace DocFileFormat
}
}break;
// GEOMETRY
case PropertyId_rotation:
case ODRAW::ePropertyId_rotation:
{
double dAngle = (double)((int)iter->op) / 65535.0;
@ -1670,24 +1689,24 @@ namespace DocFileFormat
appendStyleProperty(oStyle, L"rotation", FormatUtils::DoubleToWideString(dAngle));
}break;
// TEXTBOX
case anchorText:
case ODRAW::anchorText:
{
appendStyleProperty(oStyle, L"v-text-anchor", getTextboxAnchor(iter->op));
}break;
// WRAP DISTANCE
case dxWrapDistLeft:
case ODRAW::dxWrapDistLeft:
{
appendStyleProperty(oStyle, L"mso-wrap-distance-left", (FormatUtils::DoubleToWideString(EmuValue((int)iter->op).ToPoints()) + std::wstring(L"pt")));
}break;
case dxWrapDistRight:
case ODRAW::dxWrapDistRight:
{
appendStyleProperty(oStyle, L"mso-wrap-distance-right", (FormatUtils::DoubleToWideString(EmuValue((int)iter->op).ToPoints()) + std::wstring(L"pt")));
}break;
case dyWrapDistBottom:
case ODRAW::dyWrapDistBottom:
{
appendStyleProperty(oStyle, L"mso-wrap-distance-bottom", (FormatUtils::DoubleToWideString(EmuValue((int)iter->op).ToPoints()) + std::wstring(L"pt")));
}break;
case dyWrapDistTop:
case ODRAW::dyWrapDistTop:
{
appendStyleProperty(oStyle, L"mso-wrap-distance-top", (FormatUtils::DoubleToWideString(EmuValue((int)iter->op).ToPoints()) + std::wstring(L"pt")));
}break;
@ -1746,17 +1765,17 @@ namespace DocFileFormat
}
//
std::wstring VMLShapeMapping::buildStyle (const Shape* shape, const ChildAnchor* anchor, const std::vector<ODRAW::OfficeArtFOPTEPtr>& options, int zIndex) const
std::wstring VMLShapeMapping::buildStyle (const Shape* shape, const ChildAnchor* anchor, const std::vector<ODRAW::OfficeArtFOPTEPtr>& options, int zIndex, bool &twistDimensions) const
{
std::wstring style;
bool twistDimensions = false;
twistDimensions = false;
for (size_t i = 0; i < options.size(); i++)
{
const ODRAW::OfficeArtFOPTEPtr & iter = options[i];
if (geometryTextBooleanProperties == iter->opid)
if (ODRAW::geometryTextBooleanProperties == iter->opid)
{
ODRAW::GeometryTextBooleanProperties* booleans = dynamic_cast<ODRAW::GeometryTextBooleanProperties*>(iter.get());
@ -1766,7 +1785,7 @@ namespace DocFileFormat
}
}
else if (PropertyId_rotation == iter->opid)
else if (ODRAW::ePropertyId_rotation == iter->opid)
{
double dAngle = (double)((int)iter->op) / 65535.0;

View File

@ -91,7 +91,7 @@ namespace DocFileFormat
std::wstring getTextboxAnchor( unsigned int anchor ) const;
std::wstring buildStyle ( const Shape* shape, const ChildAnchor* anchor, const std::vector<ODRAW::OfficeArtFOPTEPtr>& options, int zIndex ) const;
std::wstring buildStyle ( const Shape* shape, const ChildAnchor* anchor, const std::vector<ODRAW::OfficeArtFOPTEPtr>& options, int zIndex, bool &twistDimensions) const;
void AppendOptionsToStyle ( std::wstring& style, const std::vector<ODRAW::OfficeArtFOPTEPtr>& options, int zIndex ) const;
int UpdateFromGuides(const int val) const;
@ -112,8 +112,8 @@ namespace DocFileFormat
void WriteEndShapeNode (const Shape* pShape);
std::wstring GetShapeID (const Shape* pShape) const;
std::wstring GetLineFrom (const ChildAnchor* pAnchor) const;
std::wstring GetLineTo (const ChildAnchor* pAnchor) const;
std::wstring GetLineFrom (const ChildAnchor* pAnchor, bool twistDimensions) const;
std::wstring GetLineTo (const ChildAnchor* pAnchor, bool twistDimensions) const;
std::wstring GetWrapCoords ( const ODRAW::OfficeArtFOPTEPtr& pOpt ) const;
std::vector<std::wstring> GetTextRectangles ( const ODRAW::OfficeArtFOPTEPtr& pOpt ) const;

View File

@ -33,6 +33,7 @@
#include "WordDocument.h"
#include "../../Common/OfficeFileErrorDescription.h"
#include "../../Common/MS-LCID.h"
#include "../../ASCOfficeXlsFile2/source/XlsFormat/Logic/SummaryInformationStream/SummaryInformation.h"
#include "../../ASCOfficeXlsFile2/source/XlsFormat/Binary/CFStream.h"
@ -79,13 +80,13 @@ namespace DocFileFormat
254, 437,//PC 437
255, 850//OEM
};
WordDocument::WordDocument (const ProgressCallback* pCallFunc, const std::wstring & sTempFolder ) :
WordDocument::WordDocument (const ProgressCallback* pCallFunc, const std::wstring & sTempFolder, const int userLCID) :
m_PieceTable(NULL), WordDocumentStream(NULL), TableStream(NULL), DataStream(NULL), FIB(NULL),
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), AnnotationsFieldsPlex(NULL),
AnnotationsReferencePlex(NULL), AnnotationsReferenceExPlex(NULL), IndividualCommentsPlex(NULL), TextboxBreakPlex(NULL), TextboxBreakPlexHeader(NULL),
AnnotationsReferencePlex(NULL), AnnotationsReferencesEx(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),
AutoTextPlex(NULL), AllPapxFkps(NULL), AllChpxFkps(NULL), AllPapx(NULL), AllPapxVector(NULL), AllSepx(NULL), Styles(NULL), listTable(NULL),
@ -94,6 +95,7 @@ namespace DocFileFormat
{
m_pCallFunc = pCallFunc;
m_sTempFolder = sTempFolder;
m_nUserLCID = userLCID;
m_pStorage = NULL;
officeArtContent = NULL;
@ -276,6 +278,17 @@ namespace DocFileFormat
}
FIB->m_CodePage = nDocumentCodePage;
if (!bDocumentCodePage && m_nUserLCID > 0)
{
int user_codepage = msLCID2DefCodePage(m_nUserLCID);
if (user_codepage > 0)
{
bDocumentCodePage = true;
nDocumentCodePage = user_codepage;
}
}
//-------------------------------------------------------------------------------------------------
try
{
@ -297,10 +310,11 @@ namespace DocFileFormat
BookmarkNames = new StringTable<WideString> (TableStream, FIB->m_FibWord97.fcSttbfBkmk, FIB->m_FibWord97.lcbSttbfBkmk, nWordVersion);
AutoTextNames = new StringTable<WideString> (TableStream, FIB->m_FibWord97.fcSttbfGlsy, FIB->m_FibWord97.lcbSttbfGlsy, nWordVersion);
AssocNames = new StringTable<WideString> (TableStream, FIB->m_FibWord97.fcSttbfAssoc, FIB->m_FibWord97.lcbSttbfAssoc, nWordVersion);
BookmarkAnnotNames = new StringTable<WideString> (TableStream, FIB->m_FibWord97.fcSttbfAtnBkmk, FIB->m_FibWord97.lcbSttbfAtnBkmk, nWordVersion);
Captions = new StringTable<WideString> (TableStream, FIB->m_FibWord97.fcSttbfCaption, FIB->m_FibWord97.lcbSttbfCaption, nWordVersion);
AutoCaptions = new StringTable<WideString> (TableStream, FIB->m_FibWord97.fcSttbfAutoCaption, FIB->m_FibWord97.lcbSttbfAutoCaption, nWordVersion);
BookmarkAnnotNames = new StringTable<WideString> (TableStream, FIB->m_FibWord97.fcSttbfAtnBkmk, FIB->m_FibWord97.lcbSttbfAtnBkmk, nWordVersion, true);
if (m_pCallFunc)
{
m_pCallFunc->OnProgress (m_pCallFunc->caller, DOC_ONPROGRESSEVENT_ID, 100000);
@ -344,9 +358,10 @@ namespace DocFileFormat
IndividualCommentsPlex = new Plex<EmptyStructure> (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfandTxt, FIB->m_FibWord97.lcbPlcfandTxt, nWordVersion);
}
if (FIB->m_FibWord2002.lcbAtrdExtra > 0)
if (FIB->m_FibWord2002.lcbAtrdExtra > 0 && AnnotationsReferencePlex)
{
AnnotationsReferenceExPlex = new Plex<AnnotationReferenceExDescriptor>(AnnotationReferenceExDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord2002.fcAtrdExtra, FIB->m_FibWord2002.lcbAtrdExtra, nWordVersion);
size_t count = AnnotationsReferencePlex->Elements.size();
AnnotationsReferencesEx = new AnnotationReferenceExDescriptors(count, TableStream, FIB->m_FibWord2002.fcAtrdExtra, FIB->m_FibWord2002.lcbAtrdExtra);
}
OfficeDrawingPlex = new Plex<Spa> (Spa::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcSpaMom, FIB->m_FibWord97.lcbPlcSpaMom, nWordVersion);
OfficeDrawingPlexHeader = new Plex<Spa> (Spa::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcSpaHdr, FIB->m_FibWord97.lcbPlcSpaHdr, nWordVersion);
@ -361,27 +376,38 @@ namespace DocFileFormat
TextboxBreakPlex = new Plex<Tbkd> (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxBkd, FIB->m_FibWord97.lcbPlcfTxbxBkd, nWordVersion);
TextboxBreakPlexHeader = new Plex<Tbkd> (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxHdrBkd, FIB->m_FibWord97.lcbPlcfTxbxHdrBkd, nWordVersion);
AnnotStartPlex = new Plex<BookmarkFirst> (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkf, FIB->m_FibWord97.lcbPlcfAtnBkf, nWordVersion);
AnnotStartPlex = new Plex<BookmarkFirst> (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkf, FIB->m_FibWord97.lcbPlcfAtnBkf, nWordVersion);
AnnotEndPlex = new Plex<EmptyStructure> (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkl, FIB->m_FibWord97.lcbPlcfAtnBkl, nWordVersion);
for (size_t i = 0; i < BookmarkStartPlex->Elements.size(); ++i)
{
BookmarkFirst* pBookmark = static_cast<BookmarkFirst*>(BookmarkStartPlex->Elements[i]);
BookmarkFirst* pBookmark = static_cast<BookmarkFirst*>(BookmarkStartPlex->Elements[i]);
if (pBookmark)
{
BookmarkStartEndCPs.push_back(std::make_pair(BookmarkStartPlex->CharacterPositions[i], BookmarkEndPlex->CharacterPositions[pBookmark->GetIndex()]));
}
}
std::vector<unsigned char*> & bookmarks = BookmarkAnnotNames->getDataExtra();
for (size_t i = 0; AnnotStartPlex && i < AnnotStartPlex->Elements.size(); ++i)
{
BookmarkFirst* pBookmark = static_cast<BookmarkFirst*>(AnnotStartPlex->Elements[i]);
if (pBookmark)
{
short ind = pBookmark->GetIndex();
if (i < AnnotStartPlex->CharacterPositions.size() -1 )
short bmc = *((short*)bookmarks[i]); //0x0100 always тут
_UINT32 lTag = *((_UINT32*)(bookmarks[i] + 2));
if (i < AnnotStartPlex->CharacterPositions.size() - 1 )
{
AnnotStartEndCPs.push_back(std::make_pair(AnnotStartPlex->CharacterPositions[i], AnnotEndPlex->CharacterPositions[i + 1]));
_annotStartEnd ann;
ann.start = AnnotStartPlex->CharacterPositions[i];
ann.end = AnnotEndPlex->CharacterPositions[i/* + 1*/];
ann.bookmarkId = lTag;
AnnotStartEndCPs.push_back(ann);
}
}
}
@ -853,7 +879,6 @@ namespace DocFileFormat
RELEASEOBJECT(AllSepx);
}
RELEASEOBJECT(Text);
RELEASEOBJECT(m_PieceTable);
@ -879,7 +904,7 @@ namespace DocFileFormat
RELEASEOBJECT(HeaderStoriesPlex);
RELEASEOBJECT(IndividualCommentsPlex);
RELEASEOBJECT(AnnotationsReferencePlex);
RELEASEOBJECT(AnnotationsReferenceExPlex);
RELEASEOBJECT(AnnotationsReferencesEx);
RELEASEOBJECT(TextboxBreakPlex);
RELEASEOBJECT(TextboxBreakPlexHeader);
RELEASEOBJECT(OfficeDrawingPlex);

View File

@ -92,7 +92,7 @@ namespace DocFileFormat
public:
WordDocument (const ProgressCallback* pCallFunc, const std::wstring & tempFolder );
WordDocument (const ProgressCallback* pCallFunc, const std::wstring & tempFolder, const int userLCID);
virtual ~WordDocument();
_UINT32 LoadDocument(const std::wstring & fileName, const std::wstring & password);
@ -153,6 +153,7 @@ namespace DocFileFormat
std::wstring m_sPassword;
std::wstring m_sTempFolder;
std::wstring m_sTempDecryptFileName;
int m_nUserLCID;
const ProgressCallback* m_pCallFunc;
@ -171,8 +172,15 @@ namespace DocFileFormat
std::map<int, int> PictureBulletsCPsMap;
struct _annotStartEnd
{
int start;
int end;
_UINT32 bookmarkId;
};
std::vector<std::pair<int, int>> BookmarkStartEndCPs;
std::vector<std::pair<int, int>> AnnotStartEndCPs;
std::vector<_annotStartEnd> AnnotStartEndCPs;
std::map<int, int> mapCommentsBookmarks;
FileInformationBlock * FIB;
StyleSheet * Styles; // The style sheet of the document
@ -211,7 +219,7 @@ namespace DocFileFormat
Plex<Spa> *OfficeDrawingPlex;
Plex<Spa> *OfficeDrawingPlexHeader;
Plex<SectionDescriptor> *SectionPlex; // A Plex containing all section descriptors
Plex<SectionDescriptor> *SectionPlex;
Plex<BookmarkFirst> *BookmarkStartPlex;
Plex<EmptyStructure> *BookmarkEndPlex;
@ -226,9 +234,9 @@ namespace DocFileFormat
Plex<FieldCharacter> *HeadersAndFootersDocumentFieldsPlex;
Plex<FieldCharacter> *AnnotationsFieldsPlex;
Plex<AnnotationReferenceDescriptor> *AnnotationsReferencePlex;
Plex<AnnotationReferenceExDescriptor> *AnnotationsReferenceExPlex;
Plex<EmptyStructure> *AutoTextPlex;
// Each character position specifies the beginning of a range of text that constitutes the contents of an AutoText item
AnnotationReferenceExDescriptors *AnnotationsReferencesEx;
};
}

View File

@ -42,10 +42,7 @@
namespace DocFileFormat
{
WordprocessingDocument::WordprocessingDocument(const std::wstring & _pathOutput, const WordDocument* _docFile) :
OpenXmlPackage( _docFile ),
FontTableXML( L"" ), DocumentXML( L"" ),
StyleSheetXML( L"" ), FootnotesXML ( L"" ), NumberingXML( L"" ),
CommentsXML( L"" ), SettingsXML( L"" ), CommandTableXML ( L"" )
OpenXmlPackage( _docFile )
{
m_strOutputPath = _pathOutput;
}
@ -131,6 +128,7 @@ namespace DocFileFormat
SaveToFile(pathWord, std::wstring( L"endnotes.xml" ), EndnotesXML );
SaveToFile(pathWord, std::wstring( L"numbering.xml" ), NumberingXML );
SaveToFile(pathWord, std::wstring( L"comments.xml" ), CommentsXML );
SaveToFile(pathWord, std::wstring( L"commentsExtended.xml"),CommentsExtendedXML );
SaveToFile(pathWord, std::wstring( L"settings.xml" ), SettingsXML );
SaveToFile(pathWord, std::wstring( L"customizations.xml" ), CommandTableXML );

View File

@ -65,6 +65,7 @@ namespace DocFileFormat
std::wstring EndnotesXML;
std::wstring NumberingXML;
std::wstring CommentsXML;
std::wstring CommentsExtendedXML;
std::wstring SettingsXML;
std::wstring CommandTableXML;

View File

@ -39,7 +39,9 @@ _UINT32 COfficeDocFile::LoadFromFile(const std::wstring & docFile, const std::w
_UINT32 hr = 0;
DocFileFormat::Converter docToDocx;
docToDocx.m_sTempFolder = m_sTempFolder;
docToDocx.m_nUserLCID = m_nUserLCID;
hr= docToDocx.LoadAndConvert(docFile, docxDirectory, password, ffCallBack, bMacros);

View File

@ -43,15 +43,11 @@ struct ProgressCallback;
class COfficeDocFile
{
public:
COfficeDocFile()
{
}
COfficeDocFile() : m_nUserLCID(-1) {}
virtual ~COfficeDocFile() {}
virtual ~COfficeDocFile()
{
}
std::wstring m_sTempFolder;
std::wstring m_sTempFolder;
int m_nUserLCID;
_UINT32 LoadFromFile(const std::wstring & sSrcFileName, const std::wstring & sDstFileName, const std::wstring & password, bool &bMacros, ProgressCallback *ffCallBack = NULL);
_UINT32 SaveToFile(const std::wstring & sDstFileName, const std::wstring & sSrcFileName, ProgressCallback *ffCallBack = NULL);

View File

@ -77,6 +77,7 @@ HRESULT convert_single(std::wstring srcFileName)
COfficeDocFile docFile;
docFile.m_sTempFolder = outputDir;
docFile.m_nUserLCID = 1049;
bool bMacros = true;
HRESULT hRes = docFile.LoadFromFile( srcFileName, dstTempPath, L"password", bMacros, NULL);

View File

@ -45,7 +45,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../../DesktopEditor/xml/build/vs2005;../../DesktopEditor/xml/libxml2/include;../../DesktopEditor/freetype-2.5.2/include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;DONT_WRITE_EMBEDDED_FONTS"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;DONT_WRITE_EMBEDDED_FONTS;DONT_USED_EXTRA_LIBRARY"
MinimalRebuild="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"

View File

@ -35,6 +35,7 @@
#define READER_CLASSES
#include "../../Common/DocxFormat/Source/XML/Utils.h"
#include "../../Common/DocxFormat/Source/Common/SimpleTypes_Word.h"
#include <boost/algorithm/string.hpp>
@ -439,13 +440,12 @@ public:
class Tab
{
public:
BYTE Val;
SimpleTypes::CTabJc<> Val;
long Pos;
BYTE Leader;
bool bLeader;
Tab()
{
Val = shd_Nil;
Pos = 0;
bLeader = false;
}
@ -688,8 +688,8 @@ public:
{
if(DStrikeout)
pCStringWriter->WriteString(L"<w:dstrike/>");
else if(false == bDoNotWriteNullProp)
pCStringWriter->WriteString(L"<w:dstrike w:val=\"false\"/>");
//else if(false == bDoNotWriteNullProp)
// pCStringWriter->WriteString(L"<w:dstrike w:val=\"false\"/>");
}
if(bVanish)
{
@ -1406,7 +1406,9 @@ class docLvl
public:
long ILvl;
long Format;
std::wstring sFormat;
BYTE Jc;
std::wstring sJc;
std::vector<docLvlText*> Text;
long Restart;
long Start;
@ -1491,7 +1493,11 @@ public:
{
oWriter.WriteString(L"<w:start w:val=\"" + std::to_wstring(Start) + L"\"/>");
}
if(bFormat)
if(!sFormat.empty())
{
oWriter.WriteString(sFormat);
}
else if(bFormat)
{
std::wstring sFormat;
switch(Format)
@ -1599,19 +1605,23 @@ public:
}
oWriter.WriteString(L"/>");
}
if(bJc)
if(!sJc.empty())
{
std::wstring sJc;
oWriter.WriteString(sJc);
}
else if(bJc)
{
std::wstring sJcType;
switch(Jc)
{
case align_Right:sJc = _T("right");break;
case align_Left:sJc = _T("left");break;
case align_Center:sJc = _T("center");break;
case align_Justify:sJc = _T("distribute");break;
case align_Right:sJcType = _T("right");break;
case align_Left:sJcType = _T("left");break;
case align_Center:sJcType = _T("center");break;
case align_Justify:sJcType = _T("distribute");break;
}
if(!sJc.empty())
if(!sJcType.empty())
{
oWriter.WriteString(L"<w:lvlJc w:val=\"" + sJc + L"\"/>");
oWriter.WriteString(L"<w:lvlJc w:val=\"" + sJcType + L"\"/>");
}
}
if(bParaPr)

View File

@ -58,6 +58,11 @@
#include "../../DesktopEditor/common/Directory.h"
#define UINT_TO_COMPLEX_BOOL(offset, val) \
if (0 != ((nFlags >> offset) & 1)) { \
val.Init(); \
}
namespace BinDocxRW {
enum ETblStyleOverrideType
@ -899,15 +904,7 @@ int Binary_pPrReader::ReadContent( BYTE type, long length, void* poResult)
for(size_t i = 0; i < nLen; ++i)
{
Tab& oTab = oTabs.m_aTabs[i];
std::wstring sVal;
switch(oTab.Val)
{
case g_tabtype_right: sVal = L"right"; break;
case g_tabtype_center: sVal = L"center"; break;
case g_tabtype_clear: sVal = L"clear"; break;
default: sVal = L"left"; break;
}
pCStringWriter->WriteString(L"<w:tab w:val=\"" + sVal + L"\" w:pos=\"" + std::to_wstring(oTab.Pos) + L"\"");
pCStringWriter->WriteString(L"<w:tab w:val=\"" + oTab.Val.ToString() + L"\" w:pos=\"" + std::to_wstring(oTab.Pos) + L"\"");
if (oTab.bLeader)
{
std::wstring sLeader;
@ -1133,7 +1130,17 @@ int Binary_pPrReader::ReadTabItem(BYTE type, long length, void* poResult)
int res = c_oSerConstants::ReadOk;
Tab* poTabItem = static_cast<Tab*>(poResult);
if(c_oSerProp_pPrType::Tab_Item_Val == type)
poTabItem->Val = m_oBufferedStream.GetUChar();
poTabItem->Val.SetValue((SimpleTypes::ETabJc)m_oBufferedStream.GetUChar());
else if(c_oSerProp_pPrType::Tab_Item_Val_deprecated == type)
{
switch(m_oBufferedStream.GetUChar())
{
case 1: poTabItem->Val.SetValue(SimpleTypes::tabjcRight);break;
case 2: poTabItem->Val.SetValue(SimpleTypes::tabjcCenter);break;
case 3: poTabItem->Val.SetValue(SimpleTypes::tabjcClear);break;
default:poTabItem->Val.SetValue(SimpleTypes::tabjcLeft);break;
}
}
else if(c_oSerProp_pPrType::Tab_Item_Pos == type)
poTabItem->Pos = SerializeCommon::Round( g_dKoef_mm_to_twips * m_oBufferedStream.GetDouble());
else if(c_oSerProp_pPrType::Tab_Item_PosTwips == type)
@ -1930,7 +1937,6 @@ int Binary_tblPrReader::Read_tblPr(BYTE type, long length, void* poResult)
Shd oShd;
READ2_DEF(length, res, oBinary_CommonReader2.ReadShd, &oShd);
pWiterTblPr->Shd = oShd.ToString();
m_sCurTableShd = pWiterTblPr->Shd;
}
else if( c_oSerProp_tblPrType::tblpPr == type )
{
@ -2397,7 +2403,6 @@ int Binary_tblPrReader::Read_CellPr(BYTE type, long length, void* poResult)
}
else if( c_oSerProp_cellPrType::Shd == type )
{
bCellShd = true;
Shd oShd;
READ2_DEF(length, res, oBinary_CommonReader2.ReadShd, &oShd);
pCStringWriter->WriteString(oShd.ToString());
@ -2819,11 +2824,24 @@ int Binary_NumberingTableReader::ReadLevel(BYTE type, long length, void* poResul
odocLvl->bFormat = true;
odocLvl->Format = m_oBufferedStream.GetLong();
}
else if ( c_oSerNumTypes::lvl_Jc == type )
else if ( c_oSerNumTypes::lvl_NumFmt == type )
{
ComplexTypes::Word::CNumFmt oNumFmt;
READ1_DEF(length, res, oBinary_pPrReader.ReadNumFmt, &oNumFmt);
odocLvl->sFormat = L"<w:numFmt " + oNumFmt.ToString() + L"/>";
}
else if ( c_oSerNumTypes::lvl_Jc_deprecated == type )
{
odocLvl->bJc = true;
odocLvl->Jc = m_oBufferedStream.GetUChar();
}
else if ( c_oSerNumTypes::lvl_Jc == type )
{
ComplexTypes::Word::CJc oJc;
oJc.m_oVal.Init();
oJc.m_oVal->SetValue((SimpleTypes::EJc)m_oBufferedStream.GetUChar());
odocLvl->sJc = L"<w:lvlJc " + oJc.ToString() + L"/>";
}
else if ( c_oSerNumTypes::lvl_LvlText == type )
{
odocLvl->bText = true;
@ -3598,10 +3616,127 @@ int Binary_SettingsTableReader::ReadSettings(BYTE type, long length, void* poRes
m_oSettingsCustom.m_oSdtGlobalShowHighlight.Init();
m_oSettingsCustom.m_oSdtGlobalShowHighlight->m_oVal.FromBool(m_oBufferedStream.GetBool());
}
else if( c_oSer_SettingsType::Compat == type )
{
OOX::Settings::CCompat oCompat;
READ1_DEF(length, res, this->ReadCompat, &oCompat);
m_oFileWriter.m_oSettingWriter.AddSetting(oCompat.toXML());
}
else
res = c_oSerConstants::ReadUnknown;
return res;
};
};
int Binary_SettingsTableReader::ReadCompat(BYTE type, long length, void* poResult)
{
OOX::Settings::CCompat* pCompat = static_cast<OOX::Settings::CCompat*>(poResult);
int res = c_oSerConstants::ReadOk;
if( c_oSerCompat::CompatSetting == type )
{
OOX::Settings::CCompatSetting* pCCompatSetting = new OOX::Settings::CCompatSetting();
READ1_DEF(length, res, this->ReadCompatSetting, pCCompatSetting);
pCompat->m_arrCompatSettings.push_back(pCCompatSetting);
}
else if( c_oSerCompat::Flags1 == type )
{
_UINT32 nFlags = m_oBufferedStream.GetULong();
UINT_TO_COMPLEX_BOOL(0, pCompat->m_oUseSingleBorderforContiguousCells);
UINT_TO_COMPLEX_BOOL(1, pCompat->m_oWpJustification);
UINT_TO_COMPLEX_BOOL(2, pCompat->m_oNoTabHangInd);
UINT_TO_COMPLEX_BOOL(3, pCompat->m_oNoLeading);
UINT_TO_COMPLEX_BOOL(4, pCompat->m_oSpaceForUL);
UINT_TO_COMPLEX_BOOL(5, pCompat->m_oNoColumnBalance);
UINT_TO_COMPLEX_BOOL(6, pCompat->m_oBalanceSingleByteDoubleByteWidth);
UINT_TO_COMPLEX_BOOL(7, pCompat->m_oNoExtraLineSpacing);
UINT_TO_COMPLEX_BOOL(8, pCompat->m_oDoNotLeaveBackslashAlone);
UINT_TO_COMPLEX_BOOL(9, pCompat->m_oUlTrailSpace);
UINT_TO_COMPLEX_BOOL(10, pCompat->m_oDoNotExpandShiftReturn);
UINT_TO_COMPLEX_BOOL(11, pCompat->m_oSpacingInWholePoints);
UINT_TO_COMPLEX_BOOL(12, pCompat->m_oLineWrapLikeWord6);
UINT_TO_COMPLEX_BOOL(13, pCompat->m_oPrintBodyTextBeforeHeader);
UINT_TO_COMPLEX_BOOL(14, pCompat->m_oPrintColBlack);
UINT_TO_COMPLEX_BOOL(15, pCompat->m_oWpSpaceWidth);
UINT_TO_COMPLEX_BOOL(16, pCompat->m_oShowBreaksInFrames);
UINT_TO_COMPLEX_BOOL(17, pCompat->m_oSubFontBySize);
UINT_TO_COMPLEX_BOOL(18, pCompat->m_oSuppressBottomSpacing);
UINT_TO_COMPLEX_BOOL(19, pCompat->m_oSuppressTopSpacing);
UINT_TO_COMPLEX_BOOL(20, pCompat->m_oSuppressSpacingAtTopOfPage);
UINT_TO_COMPLEX_BOOL(21, pCompat->m_oSuppressTopSpacingWP);
UINT_TO_COMPLEX_BOOL(22, pCompat->m_oSuppressSpBfAfterPgBrk);
UINT_TO_COMPLEX_BOOL(23, pCompat->m_oSwapBordersFacingPages);
UINT_TO_COMPLEX_BOOL(24, pCompat->m_oConvMailMergeEsc);
UINT_TO_COMPLEX_BOOL(25, pCompat->m_oTruncateFontHeightsLikeWP6);
UINT_TO_COMPLEX_BOOL(26, pCompat->m_oMwSmallCaps);
UINT_TO_COMPLEX_BOOL(27, pCompat->m_oUsePrinterMetrics);
UINT_TO_COMPLEX_BOOL(28, pCompat->m_oDoNotSuppressParagraphBorders);
UINT_TO_COMPLEX_BOOL(29, pCompat->m_oWrapTrailSpaces);
UINT_TO_COMPLEX_BOOL(30, pCompat->m_oFootnoteLayoutLikeWW8);
UINT_TO_COMPLEX_BOOL(31, pCompat->m_oShapeLayoutLikeWW8);
}
else if( c_oSerCompat::Flags2 == type )
{
_UINT32 nFlags = m_oBufferedStream.GetULong();
UINT_TO_COMPLEX_BOOL(0, pCompat->m_oAlignTablesRowByRow);
UINT_TO_COMPLEX_BOOL(1, pCompat->m_oForgetLastTabAlignment);
UINT_TO_COMPLEX_BOOL(2, pCompat->m_oAdjustLineHeightInTable);
UINT_TO_COMPLEX_BOOL(3, pCompat->m_oAutoSpaceLikeWord95);
UINT_TO_COMPLEX_BOOL(4, pCompat->m_oNoSpaceRaiseLower);
UINT_TO_COMPLEX_BOOL(5, pCompat->m_oDoNotUseHTMLParagraphAutoSpacing);
UINT_TO_COMPLEX_BOOL(6, pCompat->m_oLayoutRawTableWidth);
UINT_TO_COMPLEX_BOOL(7, pCompat->m_oLayoutTableRowsApart);
UINT_TO_COMPLEX_BOOL(8, pCompat->m_oUseWord97LineBreakRules);
UINT_TO_COMPLEX_BOOL(9, pCompat->m_oDoNotBreakWrappedTables);
UINT_TO_COMPLEX_BOOL(10, pCompat->m_oDoNotSnapToGridInCell);
UINT_TO_COMPLEX_BOOL(11, pCompat->m_oSelectFldWithFirstOrLastChar);
UINT_TO_COMPLEX_BOOL(12, pCompat->m_oApplyBreakingRules);
UINT_TO_COMPLEX_BOOL(13, pCompat->m_oDoNotWrapTextWithPunct);
UINT_TO_COMPLEX_BOOL(14, pCompat->m_oDoNotUseEastAsianBreakRules);
UINT_TO_COMPLEX_BOOL(15, pCompat->m_oUseWord2002TableStyleRules);
UINT_TO_COMPLEX_BOOL(16, pCompat->m_oGrowAutofit);
UINT_TO_COMPLEX_BOOL(17, pCompat->m_oUseFELayout);
UINT_TO_COMPLEX_BOOL(18, pCompat->m_oUseNormalStyleForList);
UINT_TO_COMPLEX_BOOL(19, pCompat->m_oDoNotUseIndentAsNumberingTabStop);
UINT_TO_COMPLEX_BOOL(20, pCompat->m_oUseAltKinsokuLineBreakRules);
UINT_TO_COMPLEX_BOOL(21, pCompat->m_oAllowSpaceOfSameStyleInTable);
UINT_TO_COMPLEX_BOOL(22, pCompat->m_oDoNotSuppressIndentation);
UINT_TO_COMPLEX_BOOL(23, pCompat->m_oDoNotAutofitConstrainedTables);
UINT_TO_COMPLEX_BOOL(24, pCompat->m_oAutofitToFirstFixedWidthCell);
UINT_TO_COMPLEX_BOOL(25, pCompat->m_oUnderlineTabInNumList);
UINT_TO_COMPLEX_BOOL(26, pCompat->m_oDisplayHangulFixedWidth);
UINT_TO_COMPLEX_BOOL(27, pCompat->m_oSplitPgBreakAndParaMark);
UINT_TO_COMPLEX_BOOL(28, pCompat->m_oDoNotVertAlignCellWithSp);
UINT_TO_COMPLEX_BOOL(29, pCompat->m_oDoNotBreakConstrainedForcedTable);
UINT_TO_COMPLEX_BOOL(30, pCompat->m_oDoNotVertAlignInTxbx);
UINT_TO_COMPLEX_BOOL(31, pCompat->m_oUseAnsiKerningPairs);
}
else if( c_oSerCompat::Flags3 == type )
{
_UINT32 nFlags = m_oBufferedStream.GetULong();
UINT_TO_COMPLEX_BOOL(0, pCompat->m_oCachedColBalance);
}
else
res = c_oSerConstants::ReadUnknown;
return res;
}
int Binary_SettingsTableReader::ReadCompatSetting(BYTE type, long length, void* poResult)
{
OOX::Settings::CCompatSetting* pCompatSetting = static_cast<OOX::Settings::CCompatSetting*>(poResult);
int res = c_oSerConstants::ReadOk;
if( c_oSerCompat::CompatName == type )
{
pCompatSetting->m_sName = m_oBufferedStream.GetString3(length);
}
else if( c_oSerCompat::CompatUri == type )
{
pCompatSetting->m_sUri = m_oBufferedStream.GetString3(length);
}
else if( c_oSerCompat::CompatValue == type )
{
pCompatSetting->m_sVal = m_oBufferedStream.GetString3(length);
}
else
res = c_oSerConstants::ReadUnknown;
return res;
}
int Binary_SettingsTableReader::ReadFootnotePr(BYTE type, long length, void* poResult)
{
OOX::Settings::CFtnDocProps* pFtnProps = static_cast<OOX::Settings::CFtnDocProps*>(poResult);
@ -3822,9 +3957,9 @@ int Binary_SettingsTableReader::ReadMathDispDef(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:dispDef");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
m_oFileWriter.m_oSettingWriter.AddSetting(sVal);
}
else
@ -3998,9 +4133,9 @@ int Binary_SettingsTableReader::ReadMathSmallFrac(BYTE type, long length, void*
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:smallFrac m:val=");
if (bVal)
sVal += _T("\"true\" />");
sVal += _T("\"on\" />");
else
sVal += _T("\"false\" />");
sVal += _T("\"off\" />");
m_oFileWriter.m_oSettingWriter.AddSetting(sVal);
}
else
@ -4032,9 +4167,9 @@ int Binary_SettingsTableReader::ReadMathWrapRight(BYTE type, long length, void*
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:wrapRight m:val=");
if (bVal)
sVal += _T("\"true\" />");
sVal += _T("\"on\" />");
else
sVal += _T("\"false\" />");
sVal += _T("\"off\" />");
m_oFileWriter.m_oSettingWriter.AddSetting(sVal);
}
else
@ -4109,13 +4244,9 @@ int Binary_DocumentTableReader::ReadDocumentContent(BYTE type, long length, void
else if(c_oSerParType::Table == type)
{
m_byteLastElemType = c_oSerParType::Table;
//сбрасываем Shd
oBinary_tblPrReader.m_sCurTableShd.clear();
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("<w:tbl>")));
READ1_DEF(length, res, this->ReadDocTable, &m_oDocumentWriter.m_oContent);
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("</w:tbl>")));
//сбрасываем Shd
oBinary_tblPrReader.m_sCurTableShd.clear();
}
else if(c_oSerParType::Sdt == type)
{
@ -4335,13 +4466,13 @@ int Binary_DocumentTableReader::ReadParagraphContent(BYTE type, long length, voi
{
OOX::Logic::CBookmarkStart oBookmarkStart;
READ1_DEF(length, res, this->ReadBookmarkStart, &oBookmarkStart);
m_oDocumentWriter.m_oContent.WriteString(oBookmarkStart.toXML());
GetRunStringWriter().WriteString(oBookmarkStart.toXML());
}
else if ( c_oSerParType::BookmarkEnd == type )
{
OOX::Logic::CBookmarkEnd oBookmarkEnd;
READ1_DEF(length, res, this->ReadBookmarkEnd, &oBookmarkEnd);
m_oDocumentWriter.m_oContent.WriteString(oBookmarkEnd.toXML());
GetRunStringWriter().WriteString(oBookmarkEnd.toXML());
}
else
res = c_oSerConstants::ReadUnknown;
@ -5087,9 +5218,9 @@ int Binary_DocumentTableReader::ReadMathAln(BYTE type, long length, void* poResu
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:aln");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5104,9 +5235,9 @@ int Binary_DocumentTableReader::ReadMathAlnScr(BYTE type, long length, void* poR
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:alnScr");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5520,12 +5651,13 @@ int Binary_DocumentTableReader::ReadMathDegHide(BYTE type, long length, void* po
int res = c_oSerConstants::ReadOk;
if ( c_oSer_OMathBottomNodesValType::Val == type )
{
//word writes "1"(excel, powerpoint write "on"). "on" is correct for word, libre, onedrive, gdrive
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:degHide");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5540,9 +5672,9 @@ int Binary_DocumentTableReader::ReadMathDiff(BYTE type, long length, void* poRes
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:diff");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5790,9 +5922,9 @@ int Binary_DocumentTableReader::ReadMathGrow(BYTE type, long length, void* poRes
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:grow");
if (!bVal)
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
else
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
GetRunStringWriter().WriteString(sVal);
}
@ -5808,9 +5940,9 @@ int Binary_DocumentTableReader::ReadMathHideBot(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:hideBot");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5825,9 +5957,9 @@ int Binary_DocumentTableReader::ReadMathHideLeft(BYTE type, long length, void* p
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:hideLeft");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5842,9 +5974,9 @@ int Binary_DocumentTableReader::ReadMathHideRight(BYTE type, long length, void*
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:hideRight");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5859,9 +5991,9 @@ int Binary_DocumentTableReader::ReadMathHideTop(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:hideTop");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -5993,9 +6125,9 @@ int Binary_DocumentTableReader::ReadMathLit(BYTE type, long length, void* poResu
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:lit");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6029,9 +6161,9 @@ int Binary_DocumentTableReader::ReadMathMaxDist(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:maxDist");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6241,9 +6373,9 @@ int Binary_DocumentTableReader::ReadMathNoBreak(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:noBreak");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6258,9 +6390,9 @@ int Binary_DocumentTableReader::ReadMathNor(BYTE type, long length, void* poResu
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:nor");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6275,9 +6407,9 @@ int Binary_DocumentTableReader::ReadMathObjDist(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:objDist");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6335,9 +6467,9 @@ int Binary_DocumentTableReader::ReadMathOpEmu(BYTE type, long length, void* poRe
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:opEmu");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6404,9 +6536,9 @@ int Binary_DocumentTableReader::ReadMathPlcHide(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:plcHide");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6689,9 +6821,9 @@ int Binary_DocumentTableReader::ReadMathShow(BYTE type, long length, void* poRes
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:show");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6893,9 +7025,9 @@ int Binary_DocumentTableReader::ReadMathStrikeBLTR(BYTE type, long length, void*
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:strikeBLTR");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6910,9 +7042,9 @@ int Binary_DocumentTableReader::ReadMathStrikeH(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:strikeH");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6927,9 +7059,9 @@ int Binary_DocumentTableReader::ReadMathStrikeTLBR(BYTE type, long length, void*
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:strikeTLBR");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6944,9 +7076,9 @@ int Binary_DocumentTableReader::ReadMathStrikeV(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:strikeV");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6982,9 +7114,9 @@ int Binary_DocumentTableReader::ReadMathSubHide(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:subHide");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -6999,9 +7131,9 @@ int Binary_DocumentTableReader::ReadMathSupHide(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:supHide");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -7016,9 +7148,9 @@ int Binary_DocumentTableReader::ReadMathTransp(BYTE type, long length, void* poR
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:transp");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -7073,9 +7205,9 @@ int Binary_DocumentTableReader::ReadMathZeroAsc(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:zeroAsc");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -7090,9 +7222,9 @@ int Binary_DocumentTableReader::ReadMathZeroDesc(BYTE type, long length, void* p
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:zaroDesc");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -7107,9 +7239,9 @@ int Binary_DocumentTableReader::ReadMathZeroWid(BYTE type, long length, void* po
bool bVal = m_oBufferedStream.GetBool();
std::wstring sVal = _T("<m:zeroWid");
if (bVal)
sVal += _T(" m:val=\"true\" />");
sVal += _T(" m:val=\"on\" />");
else
sVal += _T(" m:val=\"false\" />");
sVal += _T(" m:val=\"off\" />");
GetRunStringWriter().WriteString(sVal);
}
else
@ -7234,8 +7366,6 @@ int Binary_DocumentTableReader::ReadRunContent(BYTE type, long length, void* poR
}
else if(c_oSerRunType::table == type)
{
//сбрасываем Shd
oBinary_tblPrReader.m_sCurTableShd.clear();
//todo
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("</w:p>")));
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("<w:tbl>")));
@ -7249,8 +7379,6 @@ int Binary_DocumentTableReader::ReadRunContent(BYTE type, long length, void* poR
m_oDocumentWriter.m_oContent.Write(m_oCur_pPr);
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("</w:pPr>")));
}
//сбрасываем Shd
oBinary_tblPrReader.m_sCurTableShd.clear();
}
else if(c_oSerRunType::fldstart_deprecated == type)
{
@ -7631,13 +7759,7 @@ int Binary_DocumentTableReader::ReadCell(BYTE type, long length, void* poResult)
if( c_oSerDocTableType::Cell_Pr == type )
{
pCStringWriter->WriteString(std::wstring(_T("<w:tcPr>")));
oBinary_tblPrReader.bCellShd = false;
READ2_DEF(length, res, oBinary_tblPrReader.Read_CellPr, pCStringWriter);
if(false == oBinary_tblPrReader.bCellShd && !oBinary_tblPrReader.m_sCurTableShd.empty())
{
pCStringWriter->WriteString(oBinary_tblPrReader.m_sCurTableShd);
}
oBinary_tblPrReader.bCellShd = false;
pCStringWriter->WriteString(std::wstring(_T("</w:tcPr>")));
}
else if( c_oSerDocTableType::Cell_Content == type )
@ -8595,6 +8717,52 @@ int Binary_DocumentTableReader::ReadSdtPr(BYTE type, long length, void* poResult
pSdtPr->m_oText->m_oMultiLine.Init();
pSdtPr->m_oText->m_oMultiLine->FromBool(m_oBufferedStream.GetBool());
}
else if (c_oSerSdt::Checkbox == type)
{
pSdtPr->m_oCheckbox.Init();
READ1_DEF(length, res, this->ReadSdtCheckBox, pSdtPr->m_oCheckbox.GetPointer());
}
else
res = c_oSerConstants::ReadUnknown;
return res;
}
int Binary_DocumentTableReader::ReadSdtCheckBox(BYTE type, long length, void* poResult)
{
int res = 0;
OOX::Logic::CSdtCheckBox* pSdtCheckBox = static_cast<OOX::Logic::CSdtCheckBox*>(poResult);
if (c_oSerSdt::CheckboxChecked == type)
{
pSdtCheckBox->m_oChecked.Init();
pSdtCheckBox->m_oChecked->m_oVal.FromBool(m_oBufferedStream.GetBool());
}
else if (c_oSerSdt::CheckboxCheckedFont == type)
{
if(!pSdtCheckBox->m_oCheckedState.IsInit())
pSdtCheckBox->m_oCheckedState.Init();
pSdtCheckBox->m_oCheckedState->m_oFont.Init();
pSdtCheckBox->m_oCheckedState->m_oFont->append(m_oBufferedStream.GetString3(length));
}
else if (c_oSerSdt::CheckboxCheckedVal == type)
{
if(!pSdtCheckBox->m_oCheckedState.IsInit())
pSdtCheckBox->m_oCheckedState.Init();
pSdtCheckBox->m_oCheckedState->m_oVal.Init();
pSdtCheckBox->m_oCheckedState->m_oVal->SetValue(m_oBufferedStream.GetLong());
}
else if (c_oSerSdt::CheckboxUncheckedFont == type)
{
if(!pSdtCheckBox->m_oUncheckedState.IsInit())
pSdtCheckBox->m_oUncheckedState.Init();
pSdtCheckBox->m_oUncheckedState->m_oFont.Init();
pSdtCheckBox->m_oUncheckedState->m_oFont->append(m_oBufferedStream.GetString3(length));
}
else if (c_oSerSdt::CheckboxUncheckedVal == type)
{
if(!pSdtCheckBox->m_oUncheckedState.IsInit())
pSdtCheckBox->m_oUncheckedState.Init();
pSdtCheckBox->m_oUncheckedState->m_oVal.Init();
pSdtCheckBox->m_oUncheckedState->m_oVal->SetValue(m_oBufferedStream.GetLong());
}
else
res = c_oSerConstants::ReadUnknown;
return res;
@ -8623,13 +8791,11 @@ int Binary_DocumentTableReader::ReadSdtListItem(BYTE type, long length, void* po
ComplexTypes::Word::CSdtListItem* pSdtListItem = static_cast<ComplexTypes::Word::CSdtListItem*>(poResult);
if (c_oSerSdt::DisplayText == type)
{
pSdtListItem->m_sDisplayText.Init();
pSdtListItem->m_sDisplayText->append(m_oBufferedStream.GetString3(length));
pSdtListItem->m_sDisplayText = m_oBufferedStream.GetString3(length);
}
else if (c_oSerSdt::Value == type)
{
pSdtListItem->m_sValue.Init();
pSdtListItem->m_sValue->append(m_oBufferedStream.GetString3(length));
pSdtListItem->m_sValue = m_oBufferedStream.GetString3(length);
}
else
res = c_oSerConstants::ReadUnknown;
@ -8727,8 +8893,7 @@ int Binary_DocumentTableReader::ReadDropDownList(BYTE type, long length, void* p
OOX::Logic::CSdtDropDownList* pDropDownList = static_cast<OOX::Logic::CSdtDropDownList*>(poResult);
if (c_oSerSdt::LastValue == type)
{
pDropDownList->m_sLastValue.Init();
pDropDownList->m_sLastValue->append(m_oBufferedStream.GetString3(length));
pDropDownList->m_sLastValue = m_oBufferedStream.GetString3(length);
}
else if (c_oSerSdt::SdtListItem == type)
{

View File

@ -152,9 +152,7 @@ protected:
Binary_pPrReader oBinary_pPrReader;
Binary_CommonReader2 oBinary_CommonReader2;
public:
std::wstring m_sCurTableShd;
std::vector<double> m_aCurTblGrid;
bool bCellShd;
public:
Binary_tblPrReader(NSBinPptxRW::CBinaryFileReader& poBufferedStream, Writers::FileWriter& oFileWriter);
int Read_tblPr(BYTE type, long length, void* poResult);
@ -247,6 +245,8 @@ public:
Binary_SettingsTableReader(NSBinPptxRW::CBinaryFileReader& poBufferedStream, Writers::FileWriter& oFileWriter, OOX::CSettingsCustom& oSettingsCustom);
int Read();
int ReadSettings(BYTE type, long length, void* poResult);
int ReadCompat(BYTE type, long length, void* poResult);
int ReadCompatSetting(BYTE type, long length, void* poResult);
int ReadFootnotePr(BYTE type, long length, void* poResult);
int ReadEndnotePr(BYTE type, long length, void* poResult);
int ReadMathPr(BYTE type, long length, void* poResult);
@ -454,6 +454,7 @@ public:
int Read_SecPr(BYTE type, long length, void* poResult);
int ReadSdt(BYTE type, long length, void* poResult);
int ReadSdtPr(BYTE type, long length, void* poResult);
int ReadSdtCheckBox(BYTE type, long length, void* poResult);
int ReadSdtComboBox(BYTE type, long length, void* poResult);
int ReadSdtListItem(BYTE type, long length, void* poResult);
int ReadSdtPrDataBinding(BYTE type, long length, void* poResult);

View File

@ -37,14 +37,14 @@
namespace Writers
{
static std::wstring g_string_set_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><w:settings xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:v=\"urn:schemas-microsoft-com:vml\">");
static std::wstring g_string_set_Default = _T("<w:zoom w:percent=\"100\"/><w:characterSpacingControl w:val=\"doNotCompress\"/><w:compat><w:compatSetting w:name=\"compatibilityMode\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"15\"/><w:compatSetting w:name=\"overrideTableStyleFontSizeAndJustification\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"enableOpenTypeFeatures\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"doNotFlipMirrorIndents\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/></w:compat><w:themeFontLang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/><w:shapeDefaults><o:shapedefaults v:ext=\"edit\" spidmax=\"1026\"/><o:shapelayout v:ext=\"edit\"><o:idmap v:ext=\"edit\" data=\"1\"/></o:shapelayout></w:shapeDefaults>");
static std::wstring g_string_set_Default = _T("<w:zoom w:percent=\"100\"/><w:characterSpacingControl w:val=\"doNotCompress\"/><w:themeFontLang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/><w:shapeDefaults><o:shapedefaults v:ext=\"edit\" spidmax=\"1026\"/><o:shapelayout v:ext=\"edit\"><o:idmap v:ext=\"edit\" data=\"1\"/></o:shapelayout></w:shapeDefaults>");
static std::wstring g_string_set_End = _T("</w:settings>");
class SettingWriter
{
std::wstring m_sDir;
NSStringUtils::CStringBuilder m_oSettingWriter;
HeaderFooterWriter& m_oHeaderFooterWriter;
std::wstring m_sDir;
NSStringUtils::CStringBuilder m_oSettingWriter;
HeaderFooterWriter& m_oHeaderFooterWriter;
public:
SettingWriter(std::wstring sDir, HeaderFooterWriter& oHeaderFooterWriter):m_sDir(sDir),m_oHeaderFooterWriter(oHeaderFooterWriter)
{

View File

@ -36,9 +36,6 @@ namespace BinDocxRW
{
const double eps = 0.001;
const int shd_Clear = 0;
const int shd_Nil = 1;
const int g_tabtype_left = 0;
const int g_tabtype_right = 1;
const int g_tabtype_center = 2;
@ -173,7 +170,7 @@ extern int g_nCurFormatVersion;
AbstractNum_Lvls = 4,
Lvl = 5,
lvl_Format = 6,//deprecated (instead use lvl_NumFmt)
lvl_Jc = 7,
lvl_Jc_deprecated = 7,//deprecated
lvl_LvlText = 8,
lvl_LvlTextItem = 9,
lvl_LvlTextItemText = 10,
@ -202,7 +199,8 @@ extern int g_nCurFormatVersion;
LvlLegacy = 33,
Legacy = 34,
LegacyIndent = 35,
LegacySpace = 36
LegacySpace = 36,
lvl_Jc = 37
};}
namespace c_oSerOtherTableTypes{enum c_oSerOtherTableTypes
{
@ -345,7 +343,7 @@ extern int g_nCurFormatVersion;
Tab = 17,
Tab_Item = 18,
Tab_Item_Pos = 19,
Tab_Item_Val = 20,
Tab_Item_Val_deprecated = 20,
ParaStyle = 21,
numPr = 22,
numPr_lvl = 23,
@ -367,7 +365,8 @@ extern int g_nCurFormatVersion;
Spacing_LineTwips = 39,
Spacing_BeforeTwips = 40,
Spacing_AfterTwips = 41,
Tab_Item_PosTwips = 42
Tab_Item_PosTwips = 42,
Tab_Item_Val = 43
};}
namespace c_oSerProp_rPrType{enum c_oSerProp_rPrType
{
@ -1169,7 +1168,13 @@ extern int g_nCurFormatVersion;
Temporary = 34,
MultiLine = 35,
Appearance = 36,
Color = 37
Color = 37,
Checkbox = 38,
CheckboxChecked = 39,
CheckboxCheckedFont = 40,
CheckboxCheckedVal = 41,
CheckboxUncheckedFont = 42,
CheckboxUncheckedVal = 43
};}
namespace c_oSerFFData{enum c_oSerFFData
{
@ -1223,7 +1228,10 @@ extern int g_nCurFormatVersion;
CompatSetting = 0,
CompatName = 1,
CompatUri = 2,
CompatValue = 3
CompatValue = 3,
Flags1 = 4,
Flags2 = 5,
Flags3 = 6
};}
}

View File

@ -47,6 +47,12 @@
#endif
#include "../../ASCOfficeRtfFile/RtfFormatLib/source/ConvertationManager.h"
#define COMPLEX_BOOL_TO_UINT(offset, val) \
if(val.IsInit()) { \
nFlags |= (val->m_oVal.ToBool() ? 1 : 0) << offset; \
}
namespace BinDocxRW
{
BinaryCommonWriter::BinaryCommonWriter(ParamsWriter& oParamsWriter) : m_oStream(*oParamsWriter.m_pCBufferedStream),
@ -1099,21 +1105,7 @@ void Binary_pPrWriter::WriteTabItem(const ComplexTypes::Word::CTabStop& TabItem,
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::Tab_Item_Val);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(TabItem.m_oVal.get().GetValue())
{
case SimpleTypes::tabjcEnd:
case SimpleTypes::tabjcRight:
m_oBcw.m_oStream.WriteBYTE(g_tabtype_right);
bRight = true;
break;
case SimpleTypes::tabjcCenter:
m_oBcw.m_oStream.WriteBYTE(g_tabtype_center);
break;
case SimpleTypes::tabjcClear:
m_oBcw.m_oStream.WriteBYTE(g_tabtype_clear);
break;
default: m_oBcw.m_oStream.WriteBYTE(g_tabtype_left);break;
}
m_oBcw.m_oStream.WriteBYTE(TabItem.m_oVal->GetValue());
}
//pos
if(false != TabItem.m_oPos.IsInit())
@ -1321,9 +1313,9 @@ void Binary_pPrWriter::WriteSectPr (OOX::Logic::CSectionProperty* pSectPr)
}
if(pSectPr->m_oRtlGutter.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_secPrType::rtlGutter);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBOOL(pSectPr->m_oRtlGutter->m_oVal.ToBool());
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrType::rtlGutter);
m_oBcw.m_oStream.WriteBOOL(pSectPr->m_oRtlGutter->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
}
void Binary_pPrWriter::WritePageSettings(OOX::Logic::CSectionProperty* pSectPr)
@ -2765,50 +2757,20 @@ void BinaryNumberingTableWriter::WriteLevel(const OOX::Numbering::CLvl& lvl)
{
int nCurPos = 0;
//Format
if(false != lvl.m_oNumFmt.IsInit())
if(lvl.m_oNumFmt.IsInit())
{
const ComplexTypes::Word::CNumFmt& oNumFmt = lvl.m_oNumFmt.get();
if(false != oNumFmt.m_oVal.IsInit())
{
const SimpleTypes::CNumberFormat<>& oNumberFormat = oNumFmt.m_oVal.get();
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Format);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
switch(oNumberFormat.GetValue())
{
case SimpleTypes::numberformatNone: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_None);break;
case SimpleTypes::numberformatBullet: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_Bullet);break;
case SimpleTypes::numberformatDecimal: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_Decimal);break;
case SimpleTypes::numberformatLowerRoman: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_LowerRoman);break;
case SimpleTypes::numberformatUpperRoman: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_UpperRoman);break;
case SimpleTypes::numberformatLowerLetter: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_LowerLetter);break;
case SimpleTypes::numberformatUpperLetter: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_UpperLetter);break;
case SimpleTypes::numberformatDecimalZero: m_oBcw.m_oStream.WriteLONG(numbering_numfmt_DecimalZero);break;
default:
m_oBcw.m_oStream.WriteLONG(oNumberFormat.GetValue() + 0x2008);break; //max our numbering
}
}
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_NumFmt);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
bpPrs.WriteNumFmt(lvl.m_oNumFmt.get());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//Jc
if(false != lvl.m_oLvlJc.IsInit())
if(lvl.m_oLvlJc.IsInit() && lvl.m_oLvlJc->m_oVal.IsInit())
{
const ComplexTypes::Word::CJc& oJc = lvl.m_oLvlJc.get();
if(false != oJc.m_oVal.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Jc);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
switch(oJc.m_oVal.get().GetValue())
{
case SimpleTypes::jcCenter: m_oBcw.m_oStream.WriteBYTE(align_Center);break;
case SimpleTypes::jcStart:
case SimpleTypes::jcLeft: m_oBcw.m_oStream.WriteBYTE(align_Left);break;
case SimpleTypes::jcEnd:
case SimpleTypes::jcRight: m_oBcw.m_oStream.WriteBYTE(align_Right);break;
case SimpleTypes::jcBoth:
case SimpleTypes::jcThaiDistribute:
case SimpleTypes::jcDistribute: m_oBcw.m_oStream.WriteBYTE(align_Justify);break;
default: m_oBcw.m_oStream.WriteBYTE(align_Left);break;
}
}
m_oBcw.m_oStream.WriteBYTE(c_oSerNumTypes::lvl_Jc);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
m_oBcw.m_oStream.WriteBYTE(lvl.m_oLvlJc->m_oVal->GetValue());
}
//LvlText
if(false != lvl.m_oLvlText.IsInit())
@ -3230,7 +3192,8 @@ void BinaryDocumentTableWriter::WriteAltChunk(OOX::Media& oAltChunkFile)
{
switch(OfficeFileFormatChecker.nFileType)
{
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC:
#ifndef DONT_USED_EXTRA_LIBRARY
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC:
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC_FLAT:
{
#ifndef _IOS
@ -3244,13 +3207,14 @@ void BinaryDocumentTableWriter::WriteAltChunk(OOX::Media& oAltChunkFile)
result = S_FALSE;
#endif
}break;
case AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF:
{
RtfConvertationManager rtfConvert;
rtfConvert.m_sTempFolder = sTempDir;
result = (S_OK == rtfConvert.ConvertRtfToOOX(file_name_inp, sResultDocxDir));
}break;
case AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF:
{
RtfConvertationManager rtfConvert;
rtfConvert.m_sTempFolder = sTempDir;
result = (S_OK == rtfConvert.ConvertRtfToOOX(file_name_inp, sResultDocxDir));
}break;
#endif
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX:
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM:
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX:
@ -7301,6 +7265,52 @@ void BinaryDocumentTableWriter::WriteSdtPr(const OOX::Logic::CSdtPr& oStdPr)
m_oBcw.m_oStream.WriteBOOL(oStdPr.m_oText->m_oMultiLine->ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oStdPr.m_oCheckbox.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::Checkbox);
WriteSdtCheckBox(oStdPr.m_oCheckbox.get());
m_oBcw.WriteItemEnd(nCurPos);
}
}
void BinaryDocumentTableWriter::WriteSdtCheckBox(const OOX::Logic::CSdtCheckBox& oSdtCheckBox)
{
int nCurPos = 0;
if(oSdtCheckBox.m_oChecked.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::CheckboxChecked);
m_oBcw.m_oStream.WriteBOOL(oSdtCheckBox.m_oChecked->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSdtCheckBox.m_oCheckedState.IsInit())
{
if(oSdtCheckBox.m_oCheckedState->m_oFont.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::CheckboxCheckedFont);
m_oBcw.m_oStream.WriteStringW3(oSdtCheckBox.m_oCheckedState->m_oFont.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSdtCheckBox.m_oCheckedState->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::CheckboxCheckedVal);
m_oBcw.m_oStream.WriteLONG(oSdtCheckBox.m_oCheckedState->m_oVal->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
}
if(oSdtCheckBox.m_oUncheckedState.IsInit())
{
if(oSdtCheckBox.m_oUncheckedState->m_oFont.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::CheckboxUncheckedFont);
m_oBcw.m_oStream.WriteStringW3(oSdtCheckBox.m_oUncheckedState->m_oFont.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSdtCheckBox.m_oUncheckedState->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::CheckboxUncheckedVal);
m_oBcw.m_oStream.WriteLONG(oSdtCheckBox.m_oUncheckedState->m_oVal->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
}
}
void BinaryDocumentTableWriter::WriteSdtComboBox(const OOX::Logic::CSdtComboBox& oSdtComboBox)
{
@ -8074,6 +8084,85 @@ void BinarySettingsTableWriter::WriteColorSchemeMapping(const PPTX::Logic::ClrMa
void BinarySettingsTableWriter::WriteCompat(const OOX::Settings::CCompat& oCompat)
{
int nCurPos = 0;
_UINT32 nFlags;
nFlags = 0;
COMPLEX_BOOL_TO_UINT(0, oCompat.m_oUseSingleBorderforContiguousCells);
COMPLEX_BOOL_TO_UINT(1, oCompat.m_oWpJustification);
COMPLEX_BOOL_TO_UINT(2, oCompat.m_oNoTabHangInd);
COMPLEX_BOOL_TO_UINT(3, oCompat.m_oNoLeading);
COMPLEX_BOOL_TO_UINT(4, oCompat.m_oSpaceForUL);
COMPLEX_BOOL_TO_UINT(5, oCompat.m_oNoColumnBalance);
COMPLEX_BOOL_TO_UINT(6, oCompat.m_oBalanceSingleByteDoubleByteWidth);
COMPLEX_BOOL_TO_UINT(7, oCompat.m_oNoExtraLineSpacing);
COMPLEX_BOOL_TO_UINT(8, oCompat.m_oDoNotLeaveBackslashAlone);
COMPLEX_BOOL_TO_UINT(9, oCompat.m_oUlTrailSpace);
COMPLEX_BOOL_TO_UINT(10, oCompat.m_oDoNotExpandShiftReturn);
COMPLEX_BOOL_TO_UINT(11, oCompat.m_oSpacingInWholePoints);
COMPLEX_BOOL_TO_UINT(12, oCompat.m_oLineWrapLikeWord6);
COMPLEX_BOOL_TO_UINT(13, oCompat.m_oPrintBodyTextBeforeHeader);
COMPLEX_BOOL_TO_UINT(14, oCompat.m_oPrintColBlack);
COMPLEX_BOOL_TO_UINT(15, oCompat.m_oWpSpaceWidth);
COMPLEX_BOOL_TO_UINT(16, oCompat.m_oShowBreaksInFrames);
COMPLEX_BOOL_TO_UINT(17, oCompat.m_oSubFontBySize);
COMPLEX_BOOL_TO_UINT(18, oCompat.m_oSuppressBottomSpacing);
COMPLEX_BOOL_TO_UINT(19, oCompat.m_oSuppressTopSpacing);
COMPLEX_BOOL_TO_UINT(20, oCompat.m_oSuppressSpacingAtTopOfPage);
COMPLEX_BOOL_TO_UINT(21, oCompat.m_oSuppressTopSpacingWP);
COMPLEX_BOOL_TO_UINT(22, oCompat.m_oSuppressSpBfAfterPgBrk);
COMPLEX_BOOL_TO_UINT(23, oCompat.m_oSwapBordersFacingPages);
COMPLEX_BOOL_TO_UINT(24, oCompat.m_oConvMailMergeEsc);
COMPLEX_BOOL_TO_UINT(25, oCompat.m_oTruncateFontHeightsLikeWP6);
COMPLEX_BOOL_TO_UINT(26, oCompat.m_oMwSmallCaps);
COMPLEX_BOOL_TO_UINT(27, oCompat.m_oUsePrinterMetrics);
COMPLEX_BOOL_TO_UINT(28, oCompat.m_oDoNotSuppressParagraphBorders);
COMPLEX_BOOL_TO_UINT(29, oCompat.m_oWrapTrailSpaces);
COMPLEX_BOOL_TO_UINT(30, oCompat.m_oFootnoteLayoutLikeWW8);
COMPLEX_BOOL_TO_UINT(31, oCompat.m_oShapeLayoutLikeWW8);
nCurPos = m_oBcw.WriteItemStart(c_oSerCompat::Flags1);
m_oBcw.m_oStream.WriteULONG(nFlags);
m_oBcw.WriteItemEnd(nCurPos);
nFlags = 0;
COMPLEX_BOOL_TO_UINT(0, oCompat.m_oAlignTablesRowByRow);
COMPLEX_BOOL_TO_UINT(1, oCompat.m_oForgetLastTabAlignment);
COMPLEX_BOOL_TO_UINT(2, oCompat.m_oAdjustLineHeightInTable);
COMPLEX_BOOL_TO_UINT(3, oCompat.m_oAutoSpaceLikeWord95);
COMPLEX_BOOL_TO_UINT(4, oCompat.m_oNoSpaceRaiseLower);
COMPLEX_BOOL_TO_UINT(5, oCompat.m_oDoNotUseHTMLParagraphAutoSpacing);
COMPLEX_BOOL_TO_UINT(6, oCompat.m_oLayoutRawTableWidth);
COMPLEX_BOOL_TO_UINT(7, oCompat.m_oLayoutTableRowsApart);
COMPLEX_BOOL_TO_UINT(8, oCompat.m_oUseWord97LineBreakRules);
COMPLEX_BOOL_TO_UINT(9, oCompat.m_oDoNotBreakWrappedTables);
COMPLEX_BOOL_TO_UINT(10, oCompat.m_oDoNotSnapToGridInCell);
COMPLEX_BOOL_TO_UINT(11, oCompat.m_oSelectFldWithFirstOrLastChar);
COMPLEX_BOOL_TO_UINT(12, oCompat.m_oApplyBreakingRules);
COMPLEX_BOOL_TO_UINT(13, oCompat.m_oDoNotWrapTextWithPunct);
COMPLEX_BOOL_TO_UINT(14, oCompat.m_oDoNotUseEastAsianBreakRules);
COMPLEX_BOOL_TO_UINT(15, oCompat.m_oUseWord2002TableStyleRules);
COMPLEX_BOOL_TO_UINT(16, oCompat.m_oGrowAutofit);
COMPLEX_BOOL_TO_UINT(17, oCompat.m_oUseFELayout);
COMPLEX_BOOL_TO_UINT(18, oCompat.m_oUseNormalStyleForList);
COMPLEX_BOOL_TO_UINT(19, oCompat.m_oDoNotUseIndentAsNumberingTabStop);
COMPLEX_BOOL_TO_UINT(20, oCompat.m_oUseAltKinsokuLineBreakRules);
COMPLEX_BOOL_TO_UINT(21, oCompat.m_oAllowSpaceOfSameStyleInTable);
COMPLEX_BOOL_TO_UINT(22, oCompat.m_oDoNotSuppressIndentation);
COMPLEX_BOOL_TO_UINT(23, oCompat.m_oDoNotAutofitConstrainedTables);
COMPLEX_BOOL_TO_UINT(24, oCompat.m_oAutofitToFirstFixedWidthCell);
COMPLEX_BOOL_TO_UINT(25, oCompat.m_oUnderlineTabInNumList);
COMPLEX_BOOL_TO_UINT(26, oCompat.m_oDisplayHangulFixedWidth);
COMPLEX_BOOL_TO_UINT(27, oCompat.m_oSplitPgBreakAndParaMark);
COMPLEX_BOOL_TO_UINT(28, oCompat.m_oDoNotVertAlignCellWithSp);
COMPLEX_BOOL_TO_UINT(29, oCompat.m_oDoNotBreakConstrainedForcedTable);
COMPLEX_BOOL_TO_UINT(30, oCompat.m_oDoNotVertAlignInTxbx);
COMPLEX_BOOL_TO_UINT(31, oCompat.m_oUseAnsiKerningPairs);
nCurPos = m_oBcw.WriteItemStart(c_oSerCompat::Flags2);
m_oBcw.m_oStream.WriteULONG(nFlags);
m_oBcw.WriteItemEnd(nCurPos);
nFlags = 0;
COMPLEX_BOOL_TO_UINT(0, oCompat.m_oCachedColBalance);
nCurPos = m_oBcw.WriteItemStart(c_oSerCompat::Flags3);
m_oBcw.m_oStream.WriteULONG(nFlags);
m_oBcw.WriteItemEnd(nCurPos);
for(size_t i = 0; i < oCompat.m_arrCompatSettings.size(); ++i)
{
nCurPos = m_oBcw.WriteItemStart(c_oSerCompat::CompatSetting);

View File

@ -469,6 +469,7 @@ namespace BinDocxRW
void WriteCell(OOX::Logic::CTc& tc, OOX::Logic::CTableProperty* pTblPr, int nCurRowIndex, int nCurColIndex, int nRows, int nCols);
void WriteSdt(OOX::Logic::CSdt* pStd, int type, OOX::Logic::CTableProperty* pTblPr, int nCurRowIndex, int nRows, int nCols);
void WriteSdtPr(const OOX::Logic::CSdtPr& oStdPr);
void WriteSdtCheckBox(const OOX::Logic::CSdtCheckBox& oSdtCheckBox);
void WriteSdtComboBox(const OOX::Logic::CSdtComboBox& oSdtComboBox);
void WriteSdtListItem(const ComplexTypes::Word::CSdtListItem& oSdtListItem);
void WriteSdtPrDataBinding(const ComplexTypes::Word::CDataBinding& oDataBinding);

View File

@ -385,6 +385,78 @@ void oox2odf_converter::Impl::replace_cells_range(std::wstring& expr, bool bSele
return;
}
size_t getColAddressInv(const std::wstring & a_)
{
std::wstring a = a_;
::boost::algorithm::to_upper(a);
static const size_t r = (L'Z' - L'A' + 1);
size_t mul = 1;
bool f = true;
size_t res = 0;
for (int i = a.length() - 1; i >= 0; i--)
{
size_t v = a[i] - L'A';
if (f)
f = false;
else
v += 1;
res += v * mul;
mul *= r;
}
return res;
}
size_t getRowAdderssInv(const std::wstring & a_)
{
int sz = a_.length();
if (a_.length()>0)
{
return boost::lexical_cast<size_t>(a_)-1;
}
else
return 0;
}
void splitCellAddress(const std::wstring & a_, std::wstring & col, std::wstring & row)
{
std::wstring a = a_;
std::reverse(a.begin(), a.end());
::XmlUtils::replace_all( a, L"$", L"");
//::XmlUtils::replace_all( a, L"'", L"");
::boost::algorithm::to_upper(a);
for (size_t i = 0; i < a.length(); i++)
{
if (a[i] >= L'0' && a[i] <= L'9')
row += a[i];
else
col += a[i];
}
std::reverse(col.begin(), col.end());
std::reverse(row.begin(), row.end());
}
void getCellAddressInv(const std::wstring & a_, int & col, int & row)
{
std::wstring colStr=L"", rowStr=L"";
splitCellAddress(a_, colStr, rowStr);
col = getColAddressInv(colStr);
row = getRowAdderssInv(rowStr);
if (col > 16384) col= -1;
}
bool IsRefPresent(const std::wstring& ref_test)
{
int col = -1, row = -1;
getCellAddressInv(ref_test, col, row);
if (col >= 0 && row >=0) return true;
return false;
}
std::wstring oox2odf_converter::Impl::replace_cells_range_formater1(boost::wsmatch const & what)
{
const size_t sz = what.size();
@ -413,8 +485,21 @@ std::wstring oox2odf_converter::Impl::replace_cells_range_formater1(boost::wsmat
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"]");
bool bRefPresent = true;
if (sheet.empty() && c2.empty())
{
bRefPresent = IsRefPresent(c1);
}
if (bRefPresent)
{
s = L"[" + sheet + L"." + c1 + (c2.empty() ? L"" : (L":" + sheet + L"." + c2)) + std::wstring(L"]");
}
else
{
s = c1;
}
}
return s;
}
@ -856,67 +941,6 @@ std::wstring oox2odf_converter::convert_spacechar(std::wstring expr)
}
return expr;
}
size_t getColAddressInv(const std::wstring & a_)
{
std::wstring a = a_;
::boost::algorithm::to_upper(a);
static const size_t r = (L'Z' - L'A' + 1);
size_t mul = 1;
bool f = true;
size_t res = 0;
for (int i = a.length() - 1; i >= 0; i--)
{
size_t v = a[i] - L'A';
if (f)
f = false;
else
v += 1;
res += v * mul;
mul *= r;
}
return res;
}
size_t getRowAdderssInv(const std::wstring & a_)
{
int sz = a_.length();
if (a_.length()>0)
{
return boost::lexical_cast<size_t>(a_)-1;
}
else
return 0;
}
void splitCellAddress(const std::wstring & a_, std::wstring & col, std::wstring & row)
{
std::wstring a = a_;
std::reverse(a.begin(), a.end());
::XmlUtils::replace_all( a, L"$", L"");
//::XmlUtils::replace_all( a, L"'", L"");
::boost::algorithm::to_upper(a);
for (size_t i = 0; i < a.length(); i++)
{
if (a[i] >= L'0' && a[i] <= L'9')
row += a[i];
else
col += a[i];
}
std::reverse(col.begin(), col.end());
std::reverse(row.begin(), row.end());
}
void getCellAddressInv(const std::wstring & a_, int & col, int & row)
{
std::wstring colStr=L"", rowStr=L"";
splitCellAddress(a_, colStr, rowStr);
col = getColAddressInv(colStr);
row = getRowAdderssInv(rowStr);
}
int oox2odf_converter::get_count_value_points(std::wstring expr)
{
int count =0;

View File

@ -39,7 +39,8 @@ enum ElementType
typeNone = 0,
type_AbstractXml,
typeTextText = 1000,
typeTextTextElement = 1000,
typeTextText,
typeTextS,
typeTextTab,
typeTextLineBreak,
@ -237,6 +238,9 @@ enum ElementType
typeStyleListLevelProperties,
typeStyleListLevelLabelAlignment,
typeTextOutlineStyle,
typeTextOutlineLevelStyle,
typeStyleTabStop,
typeStyleTabStops,
typeStyleDropCap,
@ -247,6 +251,7 @@ enum ElementType
typeStyleTableColumnProperties,
typeStyleTableRowProperties,
typeStyleTableCellProperties,
typeStyleHeaderFooter,
typeStyleHeader,
typeStyleFooter,
typeStyleHeaderFirst,
@ -535,7 +540,10 @@ enum ElementType
typeOfficeAnnotation,
typeOfficeAnnotationStart,
typeOfficeAnnotationEnd,
typeStyleRegion,
typeStyleRegionLeft,
typeStyleRegionCenter,
typeStyleRegionRight,
typeOfficeScripts,
typeOfficeScript,
typeOfficePresentation,
@ -591,8 +599,6 @@ enum ElementType
typeChartRegressionCurve,
typeChartEquation,
typeStyleRegionCenter,
typeStyleRegionRight,
typeStyleChartProperties,
typeCalcextColorScaleEntry,

View File

@ -216,6 +216,7 @@ SOURCES += \
../src/odf/datatypes/dategroup.cpp \
../src/odf/datatypes/bibliography.cpp \
../src/odf/datatypes/commandtype.cpp \
../src/odf/datatypes/styleprint.cpp \
../src/docx/xlsx_conditionalFormatting.cpp \
../src/docx/xlsx_dxfs.cpp \
../src/docx/docx_content_type.cpp \
@ -476,6 +477,7 @@ HEADERS += \
../src/odf/datatypes/xlink.h \
../src/odf/datatypes/chartlabelposition.h \
../src/odf/datatypes/grandtotal.h \
../src/odf/datatypes/styleprint.h \
../src/docx/docx_content_type.h \
../src/docx/docx_conversion_context.h \
../src/docx/docx_conversion_state.h \

View File

@ -130,3 +130,4 @@
#include "../src/odf/datatypes/commandtype.cpp"
#include "../src/odf/datatypes/stylenumformat.cpp"
#include "../src/odf/datatypes/bibliography.cpp"
#include "../src/odf/datatypes/styleprint.cpp"

View File

@ -198,7 +198,30 @@ std::wstring styles_map::name(const std::wstring & Name, odf_types::style_family
}
void docx_conversion_context::add_element_to_run(std::wstring parenStyleId)
{
if (!state_.in_run_)
if(false == current_process_comment_)
{
for (size_t i = 0; i < get_comments_context().ref_start_.size(); i++)
{
output_stream() << L"<w:commentRangeStart w:id=\"" << get_comments_context().ref_start_[i] << L"\"/>";
}
get_comments_context().ref_start_.clear();
if (false == get_comments_context().ref_end_.empty())
{
for (size_t i = 0; i < get_comments_context().ref_end_.size(); i++)
{
output_stream()<< L"<w:commentRangeEnd w:id=\"" << get_comments_context().ref_end_[i] << L"\"/>";
}
for (size_t i = 0; i < get_comments_context().ref_end_.size(); i++)
{
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().ref_end_[i] << L"\"/>";
}
get_comments_context().ref_end_.clear();
}
}
if (!state_.in_run_)
{
state_.in_run_ = true;
output_stream() << L"<w:r>";
@ -241,6 +264,20 @@ void docx_conversion_context::finish_paragraph()
{
end_changes();
if (false == current_process_comment_ && false == get_comments_context().ref_end_.empty())
{
for (size_t i = 0; i < get_comments_context().ref_end_.size(); i++)
{
output_stream()<< L"<w:commentRangeEnd w:id=\"" << get_comments_context().ref_end_[i] << L"\"/>";
}
for (size_t i = 0; i < get_comments_context().ref_end_.size(); i++)
{
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().ref_end_[i] << L"\"/>";
}
get_comments_context().ref_end_.clear();
}
output_stream() << L"</w:p>";
}
@ -254,23 +291,17 @@ void docx_conversion_context::finish_run()
{
if (false == state_.in_run_) return;
if (get_comments_context().state() == 4)
if (false == current_process_comment_)
{
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().current_id() << L"\"/>";
get_comments_context().state(0);
for (size_t i = 0; i < get_comments_context().ref_.size(); i++)
{
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().ref_[i] << L"\"/>";
}
get_comments_context().ref_.clear();
}
output_stream() << L"</w:r>";
state_.in_run_ = false;
if (get_comments_context().state() == 2)
{
output_stream()<< L"<w:commentRangeEnd w:id=\"" << get_comments_context().current_id() << L"\"/>";
add_element_to_run();
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().current_id() << L"\"/>";
get_comments_context().state(0);
finish_run();
}
}
void docx_conversion_context::start_math_formula()
{
@ -609,12 +640,7 @@ void docx_conversion_context::back_context_state()
void docx_conversion_context::add_new_run(std::wstring parentStyleId)
{
finish_run();
if (get_comments_context().state() == 1 ||
get_comments_context().state() == 4)//??? comment in run
{
output_stream() << L"<w:commentRangeStart w:id=\"" << get_comments_context().current_id() << L"\" />";
get_comments_context().state(2);//active
}
add_element_to_run(parentStyleId);
}
@ -820,6 +846,16 @@ std::wstring docx_conversion_context::dump_settings_document()
{
CP_XML_NODE(L"w:mirrorMargins");
}
CP_XML_NODE(L"w:compat")
{
CP_XML_NODE(L"w:compatSetting")
{
CP_XML_ATTR(L"w:name", L"compatibilityMode" );
CP_XML_ATTR(L"w:uri", L"http://schemas.microsoft.com/office/word" );
CP_XML_ATTR(L"w:val", L"15" );
}
}
}
}
return output.str();
@ -918,28 +954,44 @@ mc:Ignorable=\"w14 wp14\">";
std::vector<int> numIds;
odf_reader::list_style_container::instances_array & arListStyles = list_styles.instances();
for (size_t i = 0; i < arListStyles.size(); i++)
{
odf_reader::office_element_ptr_array & content = arListStyles[i]->get_text_list_style()->get_content();
{
odf_reader::office_element_ptr_array & content = arListStyles[i]->get_text_list_style()->content_;
if (content.size() < 1)
if (content.empty())
continue;
const int abstractNumId = list_styles.id_by_name(arListStyles[i]->get_style_name());
numIds.push_back(abstractNumId);
strm << L"<w:abstractNum w:abstractNumId=\"" << abstractNumId << "\">";
numIds.push_back(abstractNumId);
for (size_t j = 0; j < (std::min)( content.size(), (size_t)9); j++)
{
start_text_list_style(arListStyles[i]->get_text_list_style()->get_style_name());
content[j]->docx_convert(*this);
// TODO
start_text_list_style(arListStyles[i]->get_text_list_style()->attr_.style_name_);
content[j]->docx_convert(*this);
end_text_list_style();
}
strm << L"</w:abstractNum>";
}
}
if (list_styles.outline_style())
{
const int abstractNumId = list_styles.id_outline();
numIds.push_back(abstractNumId);
strm << L"<w:abstractNum w:abstractNumId=\"" << abstractNumId << "\">";
for (size_t j = 0; j < (std::min)( list_styles.outline_style()->content_.size(), (size_t)9); j++)
{
start_text_list_style(L"Outline");
list_styles.outline_style()->content_[j]->docx_convert(*this);
end_text_list_style();
}
strm << L"</w:abstractNum>";
}
for (size_t i = 0; i < numIds.size(); i++)
{
@ -1514,7 +1566,8 @@ void docx_conversion_context::start_list_item(bool restart)
list_style_renames_[curStyleName] = newStyleName;
odf_reader::list_style_container & lists = root()->odf_context().listStyleContainer();
odf_reader::text_list_style * curStyle = lists.list_style_by_name(curStyleName);
odf_reader::text_list_style * curStyle = lists.list_style_by_name(curStyleName);
lists.add_list_style(curStyle, newStyleName);
end_list();
start_list(newStyleName);
@ -1661,6 +1714,8 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
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);
_CP_OPT(int) outline_level = calc_outline_level(Attr->outline_level_, styleInst);
process_page_break_after(styleInst);
if (styleInst->is_automatic())
@ -1700,11 +1755,14 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
set_rtl(false);
}
}
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
get_styles_context().start_process_style(styleInst);
if (outline_level)
{
set_outline_level(*Attr->outline_level_ - 1);
set_outline_level(*outline_level);
}
styleContent->docx_convert(*this);
styleContent->docx_convert(*this);
get_styles_context().end_process_style();
end_automatic_style();
@ -1726,10 +1784,11 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
start_paragraph();
//process_paragraph_style(Context.get_current_paragraph_style()); ??
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
//if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
if (outline_level)
{
output_stream() << L"<w:pPr>";
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\"/>";
output_stream() << L"<w:outlineLvl w:val=\"" << *outline_level << L"\"/>";
output_stream() << L"</w:pPr>";
}
}
@ -1737,9 +1796,10 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
//if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
if (outline_level)
{
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\"/>";
output_stream() << L"<w:outlineLvl w:val=\"" << *outline_level << L"\"/>";
}
output_stream() << L"</w:pPr>";
}
@ -1784,9 +1844,19 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
serialize_list_properties(output_stream());
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
//if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
if (outline_level)
{
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\" />";
odf_reader::list_style_container & list_styles = root()->odf_context().listStyleContainer();
if (list_style_stack_.empty() && list_styles.outline_style())
{
output_stream() << L"<w:numPr>";
output_stream() << L"<w:ilvl w:val=\"" << *outline_level - 1 << L"\"/>";
output_stream() << L"<w:numId w:val=\"" << list_styles.id_outline() << L"\"/>";
output_stream() << L"</w:numPr>";
}
output_stream() << L"<w:outlineLvl w:val=\"" << *outline_level << L"\"/>";
}
if (!get_text_tracked_context().dumpRPrInsDel_.empty())

View File

@ -475,42 +475,56 @@ private:
class comments_context : boost::noncopyable
{
public:
comments_context() : state_(0) {}
comments_context(){}
struct _comment_desc
{
_comment_desc(const std::wstring & c, int _id, const std::wstring & a, const std::wstring & d) :
content(c), id(_id), author(a), date(d)
{}
std::wstring content;
int id;
std::wstring date;
std::wstring author;
std::wstring initials;
};
void start_comment(const std::wstring & content, const std::wstring & author, const std::wstring & date, bool inRun = false)
void end_comment(const std::wstring & name)
{
std::map<std::wstring, int>::iterator pFind = comments_map_.find(name);
if (pFind != comments_map_.end())
{
ref_end_.push_back(pFind->second);
}
}
void start_comment(const std::wstring & content, const std::wstring & author, const std::wstring & date, _CP_OPT(std::wstring) name)
{
int id = comments_.size() + 1;
_comment_desc new_comment={content, id, date, author};
_comment_desc new_comment(content, id, author, date);
if ((name) && (false == name->empty()))
{
comments_map_.insert(std::make_pair(*name, id));
ref_start_.push_back(id);
}
else
{
ref_.push_back(id);
}
comments_.push_back(new_comment);
state_ = inRun ? 4 : 1;
}
int current_id()
{
if (comments_.size()>0 && state_ >0 )return comments_.back().id;
else return -1; //not set
}
void state(int state) {state_ = state;}
int state(){return state_;}
rels& get_rels(){return internal_rels_;}
std::vector<_comment_desc> comments_;
std::vector<_comment_desc> comments_;
std::vector<int> ref_start_;
std::vector<int> ref_end_;
std::vector<int> ref_;
private:
int state_;
rels internal_rels_;//это для гиперлинков или медиа в комментариях
std::map<std::wstring, int> comments_map_;
};
class text_tracked_context
{
public:
@ -934,9 +948,12 @@ public:
void start_chart(std::wstring name);
void end_chart ();
void start_comment () {current_process_comment_ = true;}
void end_comment () {current_process_comment_ = false;}
void start_comment_content () {current_process_comment_ = true;}
void end_comment_content () {current_process_comment_ = false;}
void start_comment(const std::wstring & content, const std::wstring & author, const std::wstring & date, _CP_OPT(std::wstring) name);
void end_comment(const std::wstring & name);
void start_math_formula ();
void end_math_formula ();

View File

@ -114,7 +114,7 @@ void serialize_wrap_extent(std::wostream & strm, _docx_drawing const & val)
if (odf_reader::GetProperty(val.additional,L"border_width_top",iVal)) CP_XML_ATTR(L"t",iVal.get());
if (odf_reader::GetProperty(val.additional,L"border_width_right",iVal)) CP_XML_ATTR(L"r",iVal.get());
if (odf_reader::GetProperty(val.additional,L"border_width_bottom",iVal)) CP_XML_ATTR(L"b",iVal.get());
}
}
}break;
default:
serialize_null_extent( strm);
@ -151,6 +151,7 @@ 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: //Présentation_de_tib.odt
serialize_wrap_square(strm, val);
break;
case odf_types::style_wrap::RunThrough:
@ -159,7 +160,6 @@ 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;
@ -232,6 +232,7 @@ void docx_serialize_image_child(std::wostream & strm, _docx_drawing & val)
}
oox_serialize_ln(CP_XML_STREAM(), val.additional);
oox_serialize_effects(CP_XML_STREAM(), val.additional);
}
}
}
@ -267,6 +268,7 @@ void docx_serialize_shape_child(std::wostream & strm, _docx_drawing & val)
val.serialize_shape (CP_XML_STREAM());
oox_serialize_ln(CP_XML_STREAM(), val.additional);
oox_serialize_effects(CP_XML_STREAM(), val.additional);
}
val.serialize_text(CP_XML_STREAM());
}

View File

@ -38,8 +38,9 @@
#include "oox_rels.h"
namespace cpdoccore {
namespace odf_reader {
class header_footer_impl;
namespace odf_reader
{
class header_footer_impl;
}
namespace oox {

View File

@ -169,6 +169,7 @@ void oox_chart_context::serialize(std::wostream & strm)
{
if (plot_area_.current_chart_->is3D_)
{
plot_area_.oox_serialize_view3D(CP_XML_STREAM());
//CP_XML_NODE(L"c:view3D");
CP_XML_NODE(L"c:floor");
CP_XML_NODE(L"c:backWall");

View File

@ -118,10 +118,11 @@ public:
graphic_properties_= prop;
fill_ = fill;
}
void set_plot_area_properties(std::vector<odf_reader::_property> & prop, _oox_fill &fill)
void set_plot_area_properties(std::vector<odf_reader::_property> & prop, std::vector<odf_reader::_property> & prop_3d, _oox_fill &fill)
{
reset_fill(fill);
plot_area_.properties_ = prop;
plot_area_.properties_3d_ = prop_3d;
plot_area_.fill_ = fill;
}

View File

@ -141,6 +141,67 @@ static const std::wstring _vmlDashStyle[]=
L"dashdot",
L"shortdashdotdot"
};
void oox_serialize_effects(std::wostream & strm, const std::vector<odf_reader::_property> & prop)
{
_CP_OPT(bool) bShadow;
_CP_OPT(std::wstring) strShadowColor;
_CP_OPT(double) dShadowOpacity;
_CP_OPT(double) dShadowOffsetX;
_CP_OPT(double) dShadowOffsetY;
odf_reader::GetProperty(prop, L"shadow", bShadow);
odf_reader::GetProperty(prop, L"shadow-color", strShadowColor);
odf_reader::GetProperty(prop, L"shadow-opacity", dShadowOpacity);
odf_reader::GetProperty(prop, L"shadow-offset-x", dShadowOffsetX);
odf_reader::GetProperty(prop, L"shadow-offset-y", dShadowOffsetY);
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"a:effectLst")
{
if ((bShadow) && (*bShadow))
{
CP_XML_NODE(L"a:outerShdw")
{
//CP_XML_ATTR(L"blurRad", 0);
double offsetX = dShadowOffsetX.get_value_or(0);
double offsetY = dShadowOffsetY.get_value_or(0);
double dist = sqrt(offsetX * offsetX + offsetY * offsetY);
double dir = (offsetX > 0 ? atan(offsetY / offsetX) : 0) * 180. / 3.1415926;
CP_XML_ATTR(L"dist", (int)(dist));
CP_XML_ATTR(L"dir", (int)(dir * 60000));
CP_XML_ATTR(L"rotWithShape", L"0");
CP_XML_ATTR(L"algn", L"tl");
CP_XML_NODE(L"a:srgbClr")
{
if (strShadowColor)
{
CP_XML_ATTR(L"val", *strShadowColor);
}
else
{
CP_XML_ATTR(L"val", L"000000");
}
if (dShadowOpacity)
{
CP_XML_NODE(L"a:alpha")
{
CP_XML_ATTR(L"val", *dShadowOpacity * 1000);
}
}
}
}
}
}
}
}
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":");
@ -199,7 +260,7 @@ void oox_serialize_ln(std::wostream & strm, const std::vector<odf_reader::_prope
CP_XML_NODE(ns + L":srgbClr")
{
CP_XML_ATTR2(ns_att + L"val",color);
CP_XML_ATTR2(ns_att + L"val", color);
if (dStrokeOpacity)
{
@ -233,6 +294,39 @@ void oox_serialize_ln(std::wostream & strm, const std::vector<odf_reader::_prope
}
}
}
void vml_serialize_text(std::wostream & strm, const std::vector<odf_reader::_property> & prop)
{
_CP_OPT(std::wstring) strTextContent;
odf_reader::GetProperty(prop, L"text-content", strTextContent);
CP_XML_WRITER(strm)
{
if (strTextContent)
{
CP_XML_NODE(L"v:textbox")
{
CP_XML_ATTR(L"style", L"mso-direction-alt:auto");
CP_XML_ATTR(L"o:singleclick", L"f");
CP_XML_NODE(L"div")
{
CP_XML_ATTR(L"style", L"text-align:left");
CP_XML_NODE(L"font")
{
CP_XML_ATTR(L"face", L"Segoe UI");
CP_XML_ATTR(L"size", L"160");
CP_XML_ATTR(L"color", L"#000000");
const std::wstring & test_string = strTextContent.get();
CP_XML_STREAM() << test_string;
}
}
}
}
}
}
void vml_serialize_ln(std::wostream & strm, const std::vector<odf_reader::_property> & prop)
{
_CP_OPT(std::wstring) strStrokeColor;

View File

@ -83,7 +83,7 @@ namespace oox {
class _oox_drawing
{
public:
_oox_drawing() : type(typeUnknown), id(0), x(0), y(0), cx(0), cy(0), sub_type(0), inGroup(false), lined(false), connector(false), name(L"object"), extExternal(false)
_oox_drawing() : type(typeUnknown), id(0), x(0), y(0), cx(0), cy(0), sub_type(0), hidden(false), inGroup(false), lined(false), connector(false), name(L"object"), extExternal(false)
{
}
RelsType type;
@ -92,6 +92,7 @@ namespace oox {
size_t id;
bool lined;
bool connector;
bool hidden;
std::wstring name;
int sub_type; //odf
@ -123,8 +124,10 @@ namespace oox {
void oox_serialize_ln (std::wostream & strm, const std::vector<odf_reader::_property> & val, bool always_draw = false, const std::wstring &ns = L"a");
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 oox_serialize_effects (std::wostream & strm, const std::vector<odf_reader::_property> & val);
void vml_serialize_ln (std::wostream & strm, const std::vector<odf_reader::_property> & val);
void vml_serialize_text (std::wostream & strm, const std::vector<odf_reader::_property> & val);
}
}

View File

@ -94,6 +94,8 @@ static std::wstring get_mime_type(const std::wstring & extension)
else if (L"xlsx" == extension) return L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
else if (L"docx" == extension) return L"application/vnd.openxmlformats-officedocument.wordprocessingml.document";
else if (L"doc" == extension) return L"application/msword";
else if (L"vsd" == extension) return L"application/vnd.visio";
else if (L"vsdx" == extension) return L"application/vnd.ms-visio.drawing";
else return L"application/octet-stream";

View File

@ -34,6 +34,7 @@
#include <CPOptional.h>
#include <xml/simple_xml_writer.h>
#include <boost/algorithm/string.hpp>
#include "../odf/style_text_properties.h"
@ -120,6 +121,104 @@ void oox_plot_area::reset_cross_axis()//обязательно после все
}
}
}
void oox_plot_area::oox_serialize_view3D(std::wostream & _Wostream)
{
_CP_OPT(std::wstring) strVal;
_CP_OPT(double) doubleVal;
odf_reader::GetProperty(properties_3d_, L"transform", strVal);
if (!strVal) return;
size_t pos_matrix = strVal->find(L"matrix(");
if (pos_matrix == std::wstring::npos) return;
size_t pos_matrix_end = strVal->find(L")", pos_matrix);
if (pos_matrix_end == std::wstring::npos || pos_matrix_end == pos_matrix + 7) return;
std::wstring tmp = strVal->substr(pos_matrix + 7, pos_matrix_end - 7 - pos_matrix);
std::vector<std::wstring> values;
boost::algorithm::split(values, tmp, boost::algorithm::is_any_of(L" "), boost::algorithm::token_compress_on);
if (values.size() < 12) return;
double left_x = XmlUtils::GetDouble(values[0]);
double up_x = XmlUtils::GetDouble(values[1]);
double forward_x = XmlUtils::GetDouble(values[2]);
double left_y = XmlUtils::GetDouble(values[3]);
double up_y = XmlUtils::GetDouble(values[4]);
double forward_y = XmlUtils::GetDouble(values[5]);
double left_z = XmlUtils::GetDouble(values[6]);
double up_z = XmlUtils::GetDouble(values[7]);
double forward_z = XmlUtils::GetDouble(values[8]);
const double DEG2RAD = 3.1415926 / 180;
double sx, sy, sz, cx, cy, cz, theta_x, theta_y, theta_z = 0;
sy = forward_x;
theta_y = (sy == 0 ? 0 : asin(sy));
cy = cos(theta_y);
theta_y /= DEG2RAD;
sx = - forward_y / cy;
cx = forward_z / cy;
theta_x = (sx == 0 ? 0 : asin(sx));
double theta_x_test = (sx == 0 ? 0 : acos(cx));
theta_x /= DEG2RAD;
sz = - up_x / cy;
cz = left_x / cy;
theta_z = (sz == 0 ? 0 : asin(sz));
double theta_z_test = (sz == 0 ? 0 : acos(cz));
theta_z /= DEG2RAD;
CP_XML_WRITER(_Wostream)
{
CP_XML_NODE(L"c:view3D")
{
CP_XML_NODE(L"c:rotX")
{
CP_XML_ATTR(L"val", (int) (theta_x + 0.5) );
}
CP_XML_NODE(L"c:rotY")
{
CP_XML_ATTR(L"val", (int) (theta_y + 0.5) );
}
CP_XML_NODE(L"c:depthPercent")
{
CP_XML_ATTR(L"val", 100 );
}
if (theta_z == 0)
{
CP_XML_NODE(L"c:rAngAx")
{
CP_XML_ATTR(L"val", 1 );
}
}
else
{
CP_XML_NODE(L"c:rAngAx")
{
CP_XML_ATTR(L"val", 0 );
}
CP_XML_NODE(L"c:perspective")
{
CP_XML_ATTR(L"val", (int) (theta_z * 2 + 0.5) );
}
}
}
}
}
void oox_plot_area::oox_serialize(std::wostream & _Wostream)
{
reset_cross_axis();

View File

@ -54,11 +54,13 @@ public:
std::vector<odf_reader::_property> graphic_properties_;
std::vector<odf_reader::_property> properties_;
std::vector<odf_reader::_property> properties_3d_;
_oox_fill fill_;
//std::vector<odf_reader::_property> wall_graphic_properties_;
void oox_serialize(std::wostream & _Wostream);
void oox_serialize_view3D(std::wostream & _Wostream);
void add_chart (int type);
void add_axis (int type, odf_reader::chart::axis & content);

View File

@ -101,6 +101,7 @@ void pptx_serialize_image(std::wostream & strm, _pptx_drawing & val)
CP_XML_NODE(L"a:avLst");
}
oox_serialize_ln(CP_XML_STREAM(), val.additional);
oox_serialize_effects(CP_XML_STREAM(), val.additional);
}
//_CP_OPT(std::wstring) strTextContent;
//odf::GetProperty(properties,L"text-content",strTextContent);
@ -186,7 +187,8 @@ void pptx_serialize_media(std::wostream & strm, _pptx_drawing & val)
}
oox_serialize_fill (CP_XML_STREAM(), val.fill);
oox_serialize_ln (CP_XML_STREAM(), val.additional);
}
oox_serialize_effects(CP_XML_STREAM(), val.additional);
}
//_CP_OPT(std::wstring) strTextContent;
//odf::GetProperty(properties,L"text-content",strTextContent);
//pptx_serialize_text(CP_XML_STREAM(),val.additional);
@ -248,6 +250,7 @@ void pptx_serialize_shape(std::wostream & strm, _pptx_drawing & val)
val.serialize_shape(CP_XML_STREAM());
oox_serialize_ln(CP_XML_STREAM(), val.additional);
oox_serialize_effects(CP_XML_STREAM(), val.additional);
}
}
pptx_serialize_text(CP_XML_STREAM(), val);
@ -307,6 +310,7 @@ void pptx_serialize_connector(std::wostream & strm, _pptx_drawing & val)
val.serialize_shape(CP_XML_STREAM());
oox_serialize_ln(CP_XML_STREAM(), val.additional);
oox_serialize_effects(CP_XML_STREAM(), val.additional);
}
}
pptx_serialize_text(CP_XML_STREAM(), val);

View File

@ -277,29 +277,29 @@ void pptx_text_context::Impl::ApplyListProperties(odf_reader::paragraph_format_p
if (Level < 0)return;
if (list_style_stack_.empty())return;
odf_reader::style_list_level_properties *list_properties= NULL;
odf_reader::style_list_level_properties *list_properties = NULL;
odf_reader::text_list_style * text_list_style = odf_context_.listStyleContainer().list_style_by_name(list_style_stack_.back());
if ((text_list_style) && (Level < (int)text_list_style->get_content().size()))
if ((text_list_style) && (Level < (int)text_list_style->content_.size()))
{
odf_reader::office_element_ptr elm = text_list_style->get_content()[Level];
odf_reader::office_element_ptr elm = text_list_style->content_[Level];
odf_reader::office_element_ptr elm_list;
if (elm->get_type() == typeTextListLevelStyleBullet)
{
odf_reader::text_list_level_style_bullet* list_bullet = dynamic_cast<odf_reader::text_list_level_style_bullet *>(elm.get());
if (list_bullet)elm_list = list_bullet->style_list_level_properties_;
if (list_bullet)elm_list = list_bullet->list_level_properties_;
}
if (elm->get_type() == typeTextListLevelStyleNumber)
{
odf_reader::text_list_level_style_number* list_number = dynamic_cast<odf_reader::text_list_level_style_number *>(elm.get());
if (list_number)elm_list = list_number->style_list_level_properties_;
if (list_number)elm_list = list_number->list_level_properties_;
}
if (elm->get_type() == typeTextListLevelStyleImage)
{
odf_reader::text_list_level_style_image* list_image = dynamic_cast<odf_reader::text_list_level_style_image *>(elm.get());
if (list_image)elm_list = list_image->style_list_level_properties_;
if (list_image)elm_list = list_image->list_level_properties_;
}
////////////////////
if (elm_list)
@ -633,7 +633,8 @@ void pptx_text_context::Impl::start_list_item(bool restart)
list_style_renames_[curStyleName] = newStyleName;
odf_reader::list_style_container & lists = odf_context_.listStyleContainer();
odf_reader::text_list_style * curStyle = lists.list_style_by_name(curStyleName);
odf_reader::text_list_style * curStyle = lists.list_style_by_name(curStyleName);
lists.add_list_style(curStyle, newStyleName);
end_list();
start_list(newStyleName);

View File

@ -143,6 +143,8 @@ void xml_serialize_image(std::wostream & strm, _xlsx_drawing & val, const std::w
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
if (val.hidden) CP_XML_ATTR(L"hidden", 1);
oox_serialize_action(CP_XML_STREAM(), val.action);
}
@ -185,9 +187,10 @@ void xml_serialize_shape(std::wostream & strm, _xlsx_drawing & val, const std::w
CP_XML_NODE(ns + L":cNvPr")
{
CP_XML_ATTR(L"id", val.id);//числовое значение val.rId
CP_XML_ATTR(L"name", val.name);
if (val.hidden) CP_XML_ATTR(L"hidden", 1);
oox_serialize_action(CP_XML_STREAM(), val.action);
}
CP_XML_NODE(ns + L":cNvSpPr")//non visual properies (собственно тока 1 там)
@ -220,7 +223,24 @@ void xml_serialize_object(std::wostream & strm, _xlsx_drawing & val)
{
CP_XML_ATTR(L"id", val.id); //числовое значение val.rId
CP_XML_ATTR(L"name", val.name);
}
if (val.hidden) CP_XML_ATTR(L"hidden", 1);
if (false == val.objectId.empty())
{
CP_XML_NODE(L"a:extLst")
{
CP_XML_NODE(L"a:ext")
{
CP_XML_ATTR(L"uri", L"{63B3BB69-23CF-44E3-9099-C40C66FF867C}");
CP_XML_NODE(L"a14:compatExt")
{
CP_XML_ATTR(L"spid", L"_x0000_s" + std::to_wstring(val.id));
}
}
}
}
}
CP_XML_NODE(L"xdr:cNvSpPr");
}
@ -248,7 +268,9 @@ void xml_serialize_group(std::wostream & strm, _xlsx_drawing & val, const std::w
{
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
}
if (val.hidden) CP_XML_ATTR(L"hidden", 1);
}
CP_XML_NODE(ns + L":cNvGrpSpPr");
}
CP_XML_NODE(ns + L":grpSpPr")
@ -273,7 +295,9 @@ void xml_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
{
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
}
if (val.hidden) CP_XML_ATTR(L"hidden", 1);
}
CP_XML_NODE(L"xdr:cNvGraphicFramePr");
}
@ -457,7 +481,6 @@ void _xlsx_drawing::serialize_control (std::wostream & strm)
}
}
}
}
void _xlsx_drawing::serialize_vml(std::wostream & strm)
{
@ -496,6 +519,8 @@ void _xlsx_drawing::serialize_vml(std::wostream & strm)
vml_serialize_ln(CP_XML_STREAM(), additional);
vml_serialize_text(CP_XML_STREAM(), additional);
CP_XML_NODE(L"x:ClientData")
{
switch(sub_type)

View File

@ -44,13 +44,21 @@ namespace oox {
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 )//объект
void add(_xlsx_drawing & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel )//объект
{
if (type == typeControl || type == typeControlProps || type == typeComment)
if ( type == typeControlProps || type == typeComment)
{
vml_drawings_.push_back(d);
add (isInternal, rid, ref, type, sheet_rel, true);
}
else if (type == typeControl)
{
vml_drawings_.push_back(d);
add (isInternal, rid, ref, type, sheet_rel, true);
d.hidden = true;
drawings_.push_back(d);
}
else
{
drawings_.push_back(d);
@ -129,6 +137,7 @@ 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");
CP_XML_ATTR(L"xmlns:a14", L"http://schemas.microsoft.com/office/drawing/2010/main");
for (size_t i = 0 ; i < drawings_.size(); i++)
{
@ -295,7 +304,7 @@ xlsx_drawings::~xlsx_drawings()
{
}
void xlsx_drawings::add(_xlsx_drawing const & d, bool isInternal, std::wstring const & rid,
void xlsx_drawings::add(_xlsx_drawing & d, bool isInternal, std::wstring const & rid,
std::wstring const & ref, RelsType type, bool sheet_rel)
{
impl_->add(d, isInternal, rid, ref, type, sheet_rel);

View File

@ -65,8 +65,8 @@ public:
~xlsx_drawings ();
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, bool vml_rel);
void add ( _xlsx_drawing & 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, bool vml_rel);
bool empty() const;
bool vml_empty() const;

View File

@ -59,8 +59,10 @@ public:
std::wstringstream dataValidations_;
std::wstringstream ole_objects_;
std::wstringstream page_props_;
std::wstringstream header_footer_;
std::wstringstream controls_;
std::wstringstream protection_;
std::wstringstream breaks_;
rels sheet_rels_;
@ -149,6 +151,10 @@ std::wostream & xlsx_xml_worksheet::page_properties()
{
return impl_->page_props_;
}
std::wostream & xlsx_xml_worksheet::header_footer()
{
return impl_->header_footer_;
}
std::wostream & xlsx_xml_worksheet::picture_background()
{
return impl_->picture_background_;
@ -161,6 +167,10 @@ std::wostream & xlsx_xml_worksheet::protection()
{
return impl_->protection_;
}
std::wostream & xlsx_xml_worksheet::breaks()
{
return impl_->breaks_;
}
//---------------------------------------------------------------------------------------
rels & xlsx_xml_worksheet::sheet_rels()
{
@ -212,10 +222,10 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
CP_XML_STREAM() << impl_->hyperlinks_.str();
}
}
if (false == impl_->page_props_.str().empty())
{
CP_XML_STREAM() << impl_->page_props_.str();
}//props выше legacyDrawing !!
CP_XML_STREAM() << impl_->page_props_.str();
//props выше legacyDrawing !!
CP_XML_STREAM() << impl_->header_footer_.str();
if (false == impl_->drawingId_.empty())
{
@ -254,11 +264,9 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
}
CP_XML_STREAM() << impl_->picture_background_.str();
//CP_XML_NODE(L"headerFooter){}
//или тут ??? headerFooter
//CP_XML_NODE(L"rowBreaks){}
//CP_XML_NODE(L"colBreaks){}
CP_XML_STREAM() << impl_->breaks_.str();
}
}
}

View File

@ -67,8 +67,10 @@ public:
std::wostream & sort();
std::wostream & ole_objects();
std::wostream & page_properties();
std::wostream & header_footer();
std::wostream & controls();
std::wostream & protection();
std::wostream & breaks();
rels & sheet_rels(); //hyperlink, background image, external, media ...

View File

@ -162,7 +162,7 @@ xlsx_table_state::xlsx_table_state(xlsx_conversion_context * Context, std::wstri
void xlsx_table_state::start_column(unsigned int repeated, const std::wstring & defaultCellStyleName)
{
for (unsigned int i = 0; i <repeated; ++i)
for (unsigned int i = 0; i < repeated; ++i)
column_default_cell_style_name_.push_back(defaultCellStyleName);
columns_count_ += repeated;
@ -222,7 +222,22 @@ void xlsx_table_state::start_row(const std::wstring & StyleName, const std::wstr
// set row style name
table_row_style_ = StyleName;
}
void xlsx_table_state::set_column_break_before()
{
column_breaks_.push_back(columns_count_ - columns_.back());
}
void xlsx_table_state::set_column_break_after()
{
column_breaks_.push_back(columns_count_ + 1 - columns_.back());
}
void xlsx_table_state::set_row_break_before()
{
row_breaks_.push_back(current_table_row_);
}
void xlsx_table_state::set_row_break_after()
{
row_breaks_.push_back(current_table_row_ + 1);
}
void xlsx_table_state::non_empty_row()
{
empty_row_= false;
@ -406,6 +421,49 @@ void xlsx_table_state::serialize_page_properties (std::wostream & strm)
page_layout->xlsx_serialize(strm, *context_);
}
void xlsx_table_state::serialize_header_footer (std::wostream & strm)
{
_CP_OPT(std::wstring) masterPageName = context_->root()->odf_context().styleContainer().master_page_name_by_name(table_style_);
if (!masterPageName) return;
odf_reader::style_master_page* master_style_ = context_->root()->odf_context().pageLayoutContainer().master_page_by_name(*masterPageName);
if (!master_style_) return;
odf_reader::style_header *header_odd = dynamic_cast<odf_reader::style_header*> (master_style_->style_header_.get());
odf_reader::style_header_first *header_first = dynamic_cast<odf_reader::style_header_first*> (master_style_->style_header_first_.get());
odf_reader::style_header_left *header_even = dynamic_cast<odf_reader::style_header_left*> (master_style_->style_header_left_.get());
odf_reader::style_footer *footer_odd = dynamic_cast<odf_reader::style_footer*> (master_style_->style_footer_.get());
odf_reader::style_footer_first *footer_first = dynamic_cast<odf_reader::style_footer_first*> (master_style_->style_footer_first_.get());
odf_reader::style_footer_left *footer_even = dynamic_cast<odf_reader::style_footer_left*> (master_style_->style_footer_left_.get());
if (!header_odd && !header_first && !header_even &&
!footer_odd && !footer_first && !footer_even) return;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"headerFooter")
{
if (master_style_->style_header_left_ || master_style_->style_footer_left_)
{
CP_XML_ATTR(L"differentOddEven", 1);
}
if (master_style_->style_header_first_ || master_style_->style_footer_first_)
{
CP_XML_ATTR(L"differentFirst", 1);
}
if (header_odd) header_odd->xlsx_serialize(CP_XML_STREAM(), *context_);
if (footer_odd) footer_odd->xlsx_serialize(CP_XML_STREAM(), *context_);
if (header_even) header_even->xlsx_serialize(CP_XML_STREAM(), *context_);
if (footer_even) footer_even->xlsx_serialize(CP_XML_STREAM(), *context_);
if (header_first) header_first->xlsx_serialize(CP_XML_STREAM(), *context_);
if (footer_first) footer_first->xlsx_serialize(CP_XML_STREAM(), *context_);
}
}
}
void xlsx_table_state::serialize_background (std::wostream & strm)
{
if (tableBackground_.empty()) return;
@ -565,6 +623,50 @@ void xlsx_table_state::serialize_table_format (std::wostream & strm)
}
}
void xlsx_table_state::serialize_breaks(std::wostream & strm)
{
if (column_breaks_.empty() && row_breaks_.empty()) return;
CP_XML_WRITER(strm)
{
if (false == row_breaks_.empty())
{
CP_XML_NODE(L"rowBreaks")
{
CP_XML_ATTR(L"count", row_breaks_.size());
CP_XML_ATTR(L"manualBreakCount", row_breaks_.size());
for (size_t i = 0; i < row_breaks_.size(); i++)
{
CP_XML_NODE(L"brk")
{
CP_XML_ATTR(L"id", row_breaks_[i]);
CP_XML_ATTR(L"max", 16383);
CP_XML_ATTR(L"man", 1);
}
}
}
}
if (false == column_breaks_.empty())
{
CP_XML_NODE(L"colBreaks")
{
CP_XML_ATTR(L"count", column_breaks_.size());
CP_XML_ATTR(L"manualBreakCount", column_breaks_.size());
for (size_t i = 0; i < column_breaks_.size(); i++)
{
CP_XML_NODE(L"brk")
{
CP_XML_ATTR(L"id", column_breaks_[i]);
CP_XML_ATTR(L"max", 1048575);
CP_XML_ATTR(L"man", 1);
}
}
}
}
}
}
void xlsx_table_state::serialize_merge_cells(std::wostream & strm)
{
return xlsx_merge_cells_.xlsx_serialize(strm);

View File

@ -130,7 +130,13 @@ public:
void start_column (unsigned int repeated, const std::wstring & defaultCellStyleName);
void start_row (const std::wstring & StyleName, const std::wstring & defaultCellStyleName);
void set_column_break_before();
void set_column_break_after();
void set_row_break_before();
void set_row_break_after();
void non_empty_row ();
bool is_empty_row () const;
void end_row ();
@ -184,6 +190,8 @@ public:
void serialize_page_properties (std::wostream & _Wostream);
void serialize_background (std::wostream & _Wostream);
void serialize_protection (std::wostream & _Wostream);
void serialize_header_footer (std::wostream & _Wostream);
void serialize_breaks (std::wostream & _Wostream);
void dump_rels_hyperlinks (rels & Rels);
void dump_rels_ole_objects (rels & Rels);
@ -217,6 +225,9 @@ private:
int tableId_;
std::wstring tableBackground_;
_CP_OPT(double) header_page;
_CP_OPT(double) footer_page;
std::wstring table_style_;
std::wstring table_row_style_;
std::wstring cell_style_;
@ -236,7 +247,10 @@ private:
unsigned int columns_count_;
double table_column_last_width_;
xlsx_drawing_context xlsx_drawing_context_;
std::vector<unsigned int> column_breaks_;
std::vector<unsigned int> row_breaks_;
xlsx_drawing_context xlsx_drawing_context_;
xlsx_comments_context xlsx_comments_context_;
xlsx_conditionalFormatting_context xlsx_conditionalFormatting_context_;

View File

@ -256,29 +256,6 @@ void xlsx_table_context::end_covered_cell()
{
return state()->end_covered_cell();
}
void xlsx_table_context::set_table_row_group(int count, bool collapsed, int level)
{
return state()->set_table_row_group(count, collapsed, level);
}
void xlsx_table_context::start_row(const std::wstring & StyleName, const std::wstring & defaultCellStyleName)
{
return state()->start_row(StyleName, defaultCellStyleName);
}
void xlsx_table_context::non_empty_row()
{
return state()->non_empty_row();
}
bool xlsx_table_context::is_empty_row()
{
return state()->is_empty_row();
}
void xlsx_table_context::end_row()
{
return state()->end_row();
}
void xlsx_table_context::start_column(unsigned int repeated, const std::wstring & defaultCellStyleName)
{
@ -290,6 +267,23 @@ unsigned int xlsx_table_context::columns_count()
return state()->columns_count();
}
void xlsx_table_context::set_header_page(_CP_OPT(double) val)
{
state()->header_page = val;
}
_CP_OPT(double) xlsx_table_context::get_header_page()
{
return state()->header_page;
}
void xlsx_table_context::set_footer_page(_CP_OPT(double) val)
{
state()->footer_page = val;
}
_CP_OPT(double) xlsx_table_context::get_footer_page()
{
return state()->footer_page;
}
std::wstring xlsx_table_context::default_row_cell_style()
{
return state()->default_row_cell_style();
@ -511,6 +505,10 @@ void xlsx_table_context::serialize_page_properties(std::wostream & _Wostream)
{
return state()->serialize_page_properties(_Wostream);
}
void xlsx_table_context::serialize_header_footer(std::wostream & _Wostream)
{
return state()->serialize_header_footer(_Wostream);
}
void xlsx_table_context::serialize_background(std::wostream & _Wostream)
{
return state()->serialize_background(_Wostream);
@ -531,6 +529,10 @@ void xlsx_table_context::serialize_controls(std::wostream & _Wostream)
{
return state()->serialize_controls(_Wostream);
}
void xlsx_table_context::serialize_breaks(std::wostream & _Wostream)
{
return state()->serialize_breaks(_Wostream);
}
void xlsx_table_context::dump_rels_hyperlinks(rels & Rels)
{
return state()->dump_rels_hyperlinks(Rels);
@ -539,7 +541,6 @@ void xlsx_table_context::dump_rels_ole_objects(rels & Rels)
{
return state()->dump_rels_ole_objects(Rels);
}
xlsx_table_metrics & xlsx_table_context::get_table_metrics()
{
return state()->get_table_metrics();

View File

@ -73,16 +73,16 @@ public:
int current_column();
int current_row();
void set_table_row_group(int count, bool collapsed, int level);
void start_row(const std::wstring & StyleName, const std::wstring & defaultCellStyleName);
void non_empty_row();
bool is_empty_row();
void end_row();
void start_column(unsigned int repeated, const std::wstring & defaultCellStyleName);
unsigned int columns_count();
void set_header_page(_CP_OPT(double) val);
_CP_OPT(double) get_header_page();
void set_footer_page(_CP_OPT(double) val);
_CP_OPT(double) get_footer_page();
void serialize_tableParts (std::wostream & _Wostream, rels & Rels);
void serialize_sort (std::wostream & _Wostream);
void serialize_autofilter (std::wostream & _Wostream);
@ -96,6 +96,8 @@ public:
void serialize_background (std::wostream & _Wostream);
void serialize_data_validation (std::wostream & _Wostream);
void serialize_protection (std::wostream & _Wostream);
void serialize_header_footer (std::wostream & _Wostream);
void serialize_breaks (std::wostream & _Wostream);
xlsx_table_metrics & get_table_metrics();

View File

@ -475,6 +475,7 @@ void xlsx_conversion_context::end_table()
get_table_context().serialize_table_format (current_sheet().sheetFormat());
get_table_context().serialize_page_properties (current_sheet().page_properties());
get_table_context().serialize_header_footer (current_sheet().header_footer());
get_table_context().serialize_conditionalFormatting (current_sheet().conditionalFormatting());
get_table_context().serialize_tableParts (current_sheet().tableParts(), current_sheet().sheet_rels());
get_table_context().serialize_autofilter (current_sheet().autofilter());
@ -482,6 +483,7 @@ void xlsx_conversion_context::end_table()
get_table_context().serialize_merge_cells (current_sheet().mergeCells());
get_table_context().serialize_data_validation (current_sheet().dataValidations());
get_table_context().serialize_protection (current_sheet().protection());
get_table_context().serialize_breaks (current_sheet().breaks());
get_drawing_context().set_odf_packet_path (root()->get_folder());
get_drawing_context().process_objects (get_table_metrics());
@ -576,30 +578,6 @@ void xlsx_conversion_context::end_table_column()
{
}
void xlsx_conversion_context::set_table_row_group(int count, bool collapsed, int level)
{
get_table_context().set_table_row_group(count, collapsed, level);
}
void xlsx_conversion_context::start_table_row(const std::wstring & styleName, const std::wstring & defaultCellStyleName)
{
get_table_context().start_row(styleName, defaultCellStyleName);
}
void xlsx_conversion_context::non_empty_row()
{
return get_table_context().non_empty_row();
}
bool xlsx_conversion_context::is_empty_row()
{
return get_table_context().is_empty_row();
}
void xlsx_conversion_context::end_table_row()
{
get_table_context().end_row();
}
int xlsx_conversion_context::current_table_column()
{

View File

@ -111,14 +111,7 @@ public:
double table_column_last_width ();
void end_table_column ();
void set_table_row_group (int count, bool collapsed, int level);
void start_table_row (const std::wstring & styleName, const std::wstring & defaultCellStyleName);
void non_empty_row ();
void end_table_row ();
bool is_empty_row ();
void set_current_row_height (size_t height_pt);
bool in_table_cell ();
bool in_table_cell();
void start_table_cell (const std::wstring & formula, size_t columnsSpanned, size_t rowsSpanned);
void end_table_cell ();

View File

@ -155,6 +155,22 @@ paragraph_format_properties calc_paragraph_properties_content(const std::vector<
}
return result;
}
_CP_OPT(int) calc_outline_level(_CP_OPT(int) value, const style_instance * styleInstance)
{
if (value) return value;
while (styleInstance)
{
if (styleInstance->outline_level())
{
return styleInstance->outline_level();
}
styleInstance = styleInstance->parent();
}
return boost::none;
}
void calc_tab_stops(const style_instance * styleInstance, oox::tabs_context & context)
{

View File

@ -61,5 +61,6 @@ namespace cpdoccore
style_table_cell_properties_attlist calc_table_cell_properties(const std::vector<const style_instance *> & styleInstances);
void calc_tab_stops(const style_instance * styleInstance, oox::tabs_context & context);
_CP_OPT(int) calc_outline_level(_CP_OPT(int) value, const style_instance * styleInstance);
}
}

View File

@ -371,8 +371,8 @@ void object_odf_context::oox_convert(oox::oox_chart_context & chart_context)
chart_context.set_floor (floor_);
chart_context.set_legend (legend_);
chart_context.set_plot_area_properties (plot_area_.properties_ , plot_area_.fill_);
chart_context.set_chart_graphic_properties (chart_graphic_properties_ , chart_fill_);
chart_context.set_plot_area_properties (plot_area_.properties_, plot_area_.properties_3d_, plot_area_.fill_);
chart_context.set_chart_graphic_properties (chart_graphic_properties_, chart_fill_);
//chart_context.set_footer(footer_);
//chart_context.set_chart_properties(chart_graphic_properties_);
@ -834,9 +834,15 @@ void process_build_object::visit(chart_plot_area& val)
object_odf_context_.plot_area_.cell_range_address_ = val.attlist_.table_cell_range_address_.get_value_or(L"");
ApplyChartProperties (val.attlist_.common_attlist_.chart_style_name_.get_value_or(L""),object_odf_context_.plot_area_.properties_);
ApplyGraphicProperties (val.attlist_.common_attlist_.chart_style_name_.get_value_or(L""),object_odf_context_.plot_area_.graphic_properties_, object_odf_context_.plot_area_.fill_);
ApplyTextProperties (val.attlist_.common_attlist_.chart_style_name_.get_value_or(L""),object_odf_context_.plot_area_.text_properties_);
odf_types::common_dr3d_attlist attr_3d = val.attlist_.common_dr3d_attlist_;
if (attr_3d.transform_) object_odf_context_.plot_area_.properties_3d_.push_back(_property(L"transform", attr_3d.transform_.get()) );
if (attr_3d.distance_) object_odf_context_.plot_area_.properties_3d_.push_back(_property(L"distance", attr_3d.distance_->get_value_unit(length::pt)) );
if (attr_3d.focal_length_) object_odf_context_.plot_area_.properties_3d_.push_back(_property(L"focal", attr_3d.focal_length_->get_value_unit(length::pt)) );
ApplyChartProperties (val.attlist_.common_attlist_.chart_style_name_.get_value_or(L""), object_odf_context_.plot_area_.properties_);
ApplyGraphicProperties (val.attlist_.common_attlist_.chart_style_name_.get_value_or(L""), object_odf_context_.plot_area_.graphic_properties_, object_odf_context_.plot_area_.fill_);
ApplyTextProperties (val.attlist_.common_attlist_.chart_style_name_.get_value_or(L""), object_odf_context_.plot_area_.text_properties_);
}

View File

@ -283,9 +283,9 @@ public:
process_build_object(object_odf_context & object_context, odf_read_context & context);
private:
void ApplyChartProperties(std::wstring style,std::vector<_property> & propertiesOut);
void ApplyTextProperties(std::wstring style,std::vector<_property> & propertiesOut);
void ApplyGraphicProperties(std::wstring style,std::vector<_property> & propertiesOut, oox::_oox_fill & fill);
void ApplyChartProperties(std::wstring style, std::vector<_property> & propertiesOut);
void ApplyTextProperties(std::wstring style, std::vector<_property> & propertiesOut);
void ApplyGraphicProperties(std::wstring style, std::vector<_property> & propertiesOut, oox::_oox_fill & fill);
bool visit_table(std::wstring const & name);
void visit_column(unsigned int repeated);

View File

@ -100,7 +100,8 @@ namespace chart {
};
struct plot_area : public simple
{
std::wstring cell_range_address_;
std::wstring cell_range_address_;
std::vector<_property> properties_3d_;
//series_in_column_or_row
//uses_first_as_label
};

View File

@ -265,21 +265,30 @@ void common_break_attlist::serialize(CP_ATTR_NODE)
void common_page_number_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
_CP_OPT(std::wstring) str;
CP_APPLY_ATTR(L"style:page-number", str);
_CP_OPT(std::wstring) str1;
CP_APPLY_ATTR(L"style:page-number", str1);
if ((str) && (*str != L"auto"))
if ((str1) && (*str1 != L"auto"))
{
style_page_number_ = XmlUtils::GetInteger(*str);
style_page_number_ = XmlUtils::GetInteger(*str1);
}
_CP_OPT(std::wstring) str2;
CP_APPLY_ATTR(L"style:first-page-number", str2);
if ((str2) && (*str2 != L"continue"))
{
style_first_page_number_ = XmlUtils::GetInteger(*str1);
}
}
void common_page_number_attlist::apply_from(const common_page_number_attlist & Other)
{
_CP_APPLY_PROP(style_page_number_, Other.style_page_number_);
_CP_APPLY_PROP(style_first_page_number_, Other.style_first_page_number_);
}
void common_page_number_attlist::serialize(CP_ATTR_NODE)
{
CP_XML_ATTR_OPT(L"style:page-number", style_page_number_);
CP_XML_ATTR_OPT(L"style:first-page-number", style_first_page_number_);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -301,14 +310,32 @@ void common_background_color_attlist::serialize(CP_ATTR_NODE)
void common_shadow_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:shadow", style_shadow_);
CP_APPLY_ATTR(L"draw:shadow", draw_shadow_);
CP_APPLY_ATTR(L"draw:shadow-opacity", draw_shadow_opacity_);
CP_APPLY_ATTR(L"draw:shadow-color", draw_shadow_color_);
CP_APPLY_ATTR(L"draw:shadow-offset-y", draw_shadow_offset_y_);
CP_APPLY_ATTR(L"draw:shadow-offset-x", draw_shadow_offset_x_);
}
void common_shadow_attlist::apply_from(const common_shadow_attlist & Other)
{
_CP_APPLY_PROP(style_shadow_, Other.style_shadow_);
_CP_APPLY_PROP(style_shadow_, Other.style_shadow_);
_CP_APPLY_PROP(draw_shadow_, Other.draw_shadow_);
_CP_APPLY_PROP(draw_shadow_opacity_, Other.draw_shadow_opacity_);
_CP_APPLY_PROP(draw_shadow_color_, Other.draw_shadow_color_);
_CP_APPLY_PROP(draw_shadow_offset_y_, Other.draw_shadow_offset_y_);
_CP_APPLY_PROP(draw_shadow_offset_x_, Other.draw_shadow_offset_x_);
}
void common_shadow_attlist::serialize(CP_ATTR_NODE)
{
CP_XML_ATTR_OPT(L"style:shadow", style_shadow_);
CP_XML_ATTR_OPT(L"draw:shadow", draw_shadow_);
CP_XML_ATTR_OPT(L"draw:shadow-opacity", draw_shadow_opacity_);
CP_XML_ATTR_OPT(L"draw:shadow-color", draw_shadow_color_);
CP_XML_ATTR_OPT(L"draw:shadow-offset-y", draw_shadow_offset_y_);
CP_XML_ATTR_OPT(L"draw:shadow-offset-x", draw_shadow_offset_x_);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -732,14 +759,14 @@ void common_shape_draw_attlist::apply_from(const common_shape_draw_attlist & Oth
void common_shape_draw_attlist::serialize(CP_ATTR_NODE)
{
CP_XML_ATTR_OPT(L"draw:name", draw_name_);
CP_XML_ATTR_OPT(L"draw:style-name", draw_style_name_);
CP_XML_ATTR_OPT(L"draw:class-names", draw_class_names_);
CP_XML_ATTR_OPT(L"draw:id", draw_id_);
CP_XML_ATTR_OPT(L"draw:z-index", draw_z_index_);
CP_XML_ATTR_OPT(L"draw:text-style-name", draw_text_style_name_);
CP_XML_ATTR_OPT(L"draw:layer", draw_layer_);
CP_XML_ATTR_OPT(L"draw:transform", draw_transform_);
CP_XML_ATTR_OPT(L"draw:name", draw_name_);
CP_XML_ATTR_OPT(L"draw:text-style-name", draw_text_style_name_);
CP_XML_ATTR_OPT(L"drawooo:display", drawooo_display_);
}
void common_draw_shape_with_text_and_styles_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
@ -825,9 +852,9 @@ void common_presentation_attlist::apply_from(const common_presentation_attlist &
}
void common_presentation_attlist::serialize(CP_ATTR_NODE)
{
CP_XML_ATTR_OPT(L"presentation:class", presentation_class_);
CP_XML_ATTR_OPT(L"presentation:class-names", presentation_class_names_);
CP_XML_ATTR_OPT(L"presentation:style-name", presentation_style_name_);
CP_XML_ATTR_OPT(L"presentation:class", presentation_class_);
CP_XML_ATTR_OPT(L"presentation:placeholder", presentation_placeholder_);
CP_XML_ATTR_OPT(L"presentation:user-transformed", presentation_user_transformed_);
}
@ -886,7 +913,7 @@ void section_attlists::serialize(CP_ATTR_NODE)
CP_XML_ATTR_OPT(L"text:display", display_);
CP_XML_ATTR_OPT(L"text:condition", condition_);
}
void dr3d_attlist::serialize(CP_ATTR_NODE)
void common_dr3d_attlist::serialize(CP_ATTR_NODE)
{
CP_XML_ATTR_OPT(L"dr3d:transform", transform_);
CP_XML_ATTR_OPT(L"dr3d:vrp", vrp_);
@ -899,7 +926,7 @@ void dr3d_attlist::serialize(CP_ATTR_NODE)
CP_XML_ATTR_OPT(L"dr3d:shade-mode", shade_mode_);
CP_XML_ATTR_OPT(L"dr3d:lighting-mode", lighting_mode_);
}
void dr3d_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
void common_dr3d_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"dr3d:vpn", vpn_);
CP_APPLY_ATTR(L"dr3d:vrp", vrp_);

View File

@ -191,6 +191,7 @@ public:
void serialize(CP_ATTR_NODE);
_CP_OPT(unsigned int) style_page_number_;
_CP_OPT(unsigned int) style_first_page_number_;
};
@ -214,8 +215,13 @@ public:
void apply_from(const common_shadow_attlist & Other);
void serialize(CP_ATTR_NODE);
_CP_OPT(shadow_type) style_shadow_;
_CP_OPT(shadow_type) style_shadow_;
_CP_OPT(odf_types::shadow_type1) draw_shadow_;
_CP_OPT(odf_types::percent) draw_shadow_opacity_;
_CP_OPT(odf_types::color) draw_shadow_color_;
_CP_OPT(odf_types::length) draw_shadow_offset_y_;
_CP_OPT(odf_types::length) draw_shadow_offset_x_;
};
// common-keep-with-next-attlist
@ -613,7 +619,7 @@ public:
};
class dr3d_attlist
class common_dr3d_attlist
{
public:
void add_attributes ( const xml::attributes_wc_ptr & Attributes );

View File

@ -97,6 +97,9 @@ std::wostream & operator << (std::wostream & _Wostream, const style_numformat &
style_numformat style_numformat::parse(const std::wstring & Str)
{
if (Str.empty())
return style_numformat( none );
std::wstring tmp = Str;
boost::algorithm::to_lower(tmp);

View File

@ -48,6 +48,7 @@ class style_numformat
public:
enum type
{
none,
arabic,
romanUc,
romanLc,

View File

@ -0,0 +1,84 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "styleprint.h"
#include <boost/algorithm/string.hpp>
#include <ostream>
namespace cpdoccore { namespace odf_types {
std::wostream & operator << (std::wostream & _Wostream, const style_print & _Val)
{
std::wstring result;
if (_Val.bAnnotations) result += L" annotations";
if (_Val.bCharts) result += L" charts";
if (_Val.bDrawings) result += L" drawings";
if (_Val.bFormulas) result += L" formulas";
if (_Val.bHeaders) result += L" headers";
if (_Val.bGrid) result += L" grid";
if (_Val.bObjects) result += L" objects";
if (_Val.bZeroValues) result += L" zero-values";
if (!result.empty())
_Wostream << result.substr(1);
return _Wostream;
}
style_print style_print::parse(const std::wstring & Str)
{
if (Str.empty()) return style_print();
style_print result(false);
std::vector<std::wstring> values;
boost::algorithm::split(values, Str, boost::algorithm::is_any_of(L" "), boost::algorithm::token_compress_on);
for (size_t i = 0; i < values.size(); ++i)
{
boost::algorithm::to_lower(values[i]);
if (values[i] == L"annotations") result.bAnnotations = true;
else if (values[i] == L"charts") result.bCharts = true;
else if (values[i] == L"drawings") result.bDrawings = true;
else if (values[i] == L"formulas") result.bFormulas = true;
else if (values[i] == L"headers") result.bHeaders = true;
else if (values[i] == L"grid") result.bGrid = true;
else if (values[i] == L"objects") result.bObjects = true;
else if (values[i] == L"zero-values") result.bZeroValues = true;
}
return result;
}
} }

View File

@ -0,0 +1,71 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#include <iosfwd>
#include <string>
#include "odfattributes.h"
namespace cpdoccore { namespace odf_types {
class style_print
{
public:
style_print() : bAnnotations(false), bCharts(true), bDrawings(true), bFormulas(false), bHeaders(false), bGrid(false), bObjects(true), bZeroValues(true)
{}//default ms
style_print(bool def) : bAnnotations(def), bCharts(def), bDrawings(def), bFormulas(def), bHeaders(def), bGrid(def), bObjects(def), bZeroValues(def)
{}
static style_print parse(const std::wstring & Str);
bool bAnnotations;
bool bCharts;
bool bDrawings;
bool bFormulas;
bool bHeaders;
bool bGrid;
bool bObjects;
bool bZeroValues;
};
std::wostream & operator << (std::wostream & _Wostream, const style_print & _Val);
}
APPLY_PARSE_XML_ATTRIBUTES(odf_types::style_print);
}

View File

@ -29,12 +29,7 @@
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#ifndef _CPDOCCORE_ODF_STYLEREPEAT_H_
#define _CPDOCCORE_ODF_STYLEREPEAT_H_
#ifdef _MSC_VER
#pragma once
#endif
#include <iosfwd>
#include <string>
@ -78,4 +73,3 @@ APPLY_PARSE_XML_ATTRIBUTES(odf_types::style_repeat);
}
#endif

View File

@ -29,12 +29,7 @@
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#ifndef _CPDOCCORE_ODF_STYLETYPE_H_
#define _CPDOCCORE_ODF_STYLETYPE_H_
#ifdef _MSC_VER
#pragma once
#endif
#include <iosfwd>
#include <string>
@ -79,4 +74,3 @@ APPLY_PARSE_XML_ATTRIBUTES(odf_types::style_type);
}
#endif

View File

@ -29,12 +29,7 @@
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#ifndef _CPDOCCORE_ODF_STYLEVERTICALPOS_H_
#define _CPDOCCORE_ODF_STYLEVERTICALPOS_H_
#ifdef _MSC_VER
#pragma once
#endif
#include <iosfwd>
#include <string>
@ -87,5 +82,3 @@ std::wostream & operator << (std::wostream & _Wostream, const vertical_pos & _Va
APPLY_PARSE_XML_ATTRIBUTES(odf_types::vertical_pos);
}
#endif

View File

@ -562,7 +562,6 @@ void Compute_GraphicFill(const common_draw_fill_attlist & props, const office_el
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * draw_a::ns = L"draw";
const wchar_t * draw_a::name = L"a";
/////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -159,7 +159,7 @@ length ComputeContextWidth(const style_page_layout_properties * pageProperties
if (pagePropertiesNode)
{
if (const style_columns * styleColumns
= dynamic_cast<const style_columns*>( pagePropertiesNode->elements_.style_columns_.get()))
= dynamic_cast<const style_columns*>( pagePropertiesNode->style_columns_.get()))
{
columnsCount = styleColumns->fo_column_count_.get_value_or(1);
if (!columnsCount)
@ -858,7 +858,7 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
std::wstring transformStr = attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_transform_.get();
docx_convert_transforms(transformStr, drawing->additional);
}
if (!drawing->isInline)
if (false == drawing->isInline)
{
drawing->relativeHeight = L"2";
drawing->behindDoc = L"0";
@ -913,9 +913,9 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
{
drawing->posOffsetV = (int)(length(0.01, length::cm).get_value_unit(length::emu));
}
//////////////////////////////////////////////
//----------------------------------------------------
graphicProperties.apply_to(drawing->additional);
//////////////////////////////////////////
//----------------------------------------------------
bool bTxbx = (drawing->sub_type == 1);
Compute_GraphicFill(graphicProperties.common_draw_fill_attlist_, graphicProperties.style_background_image_, Context.root()->odf_context().drawStyles(),drawing->fill, bTxbx);
@ -926,7 +926,7 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
drawing->fill.bitmap->rId = Context.get_mediaitems()->add_or_find(href, oox::typeImage, drawing->fill.bitmap->isInternal, href);
}
////////////////////////////////////////////////////
//----------------------------------------------------
drawing->additional.push_back(odf_reader::_property(L"border_width_left", Compute_BorderWidth(graphicProperties, sideLeft)));
drawing->additional.push_back(odf_reader::_property(L"border_width_top", Compute_BorderWidth(graphicProperties, sideTop)));
drawing->additional.push_back(odf_reader::_property(L"border_width_right", Compute_BorderWidth(graphicProperties, sideRight)));
@ -941,7 +941,8 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
}
}
///////////////////////////
//----------------------------------------------------
//----------------------------------------------------
if (attlists_.rel_size_.common_draw_size_attlist_.svg_width_)
{
double w_shape = attlists_.rel_size_.common_draw_size_attlist_.svg_width_->get_value_unit(length::pt);
@ -969,11 +970,24 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
drawing->x += new_x;
drawing->y += new_y;
}
if (Context.process_headers_footers_ && drawing->posOffsetH < 0)
{//p7офис_Альт.odt
const _CP_OPT(length) pageMarginLeft = CalcResultLength(pageProperties.common_horizontal_margin_attlist_.fo_margin_left_, pageProperties.fo_page_width_);
if (pageMarginLeft)
{
double val = pageMarginLeft->get_value_unit(length::emu);
if (drawing->posOffsetH < - val)
drawing->posOffsetH = -val;
}
}
GetProperty(drawing->additional, L"svg:scale_x",dVal);
GetProperty(drawing->additional, L"svg:scale_x", dVal);
if (dVal)drawing->cx = (int)(0.5 + drawing->cx * dVal.get());
GetProperty(drawing->additional, L"svg:scale_y",dVal);
GetProperty(drawing->additional, L"svg:scale_y", dVal);
if (dVal)drawing->cy = (int)(0.5 + drawing->cy * dVal.get());
GetProperty(drawing->additional, L"svg:translate_x", dVal);

View File

@ -464,7 +464,7 @@ const wchar_t * draw_equation::name = L"equation";
void draw_equation::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
draw_equation_attlist_.add_attributes(Attributes);
attlist_.add_attributes(Attributes);
}
int draw_enhanced_geometry::parsing(_CP_OPT(std::wstring) val)
{
@ -591,6 +591,44 @@ void draw_enhanced_geometry::find_draw_type_oox()
}
}
}
if (attlist_.drawooo_enhanced_path_) odf_path_ = attlist_.drawooo_enhanced_path_.get();
else if (attlist_.draw_enhanced_path_) odf_path_ = attlist_.draw_enhanced_path_.get();
for (size_t i = 0; i < draw_equation_.size(); i++)
{
draw_equation* eq = dynamic_cast<draw_equation*>(draw_equation_[i].get());
if (eq)
{
std::wstring name = eq->attlist_.draw_name_.get_value_or(L"");
std::wstring value = eq->attlist_.draw_formula_.get_value_or(L"");
map_draw_equation_.insert(std::make_pair(name, value));
}
}
if (false == odf_path_.empty())
{
size_t pos = 0;
while(true)
{
pos = odf_path_.find(L"?", pos);
if (pos == std::wstring::npos)
break;
size_t pos1 = odf_path_.find(L" ", pos);
std::wstring name = odf_path_.substr(pos + 1, pos1 - pos - 1);
std::map<std::wstring, std::wstring>::iterator pFind = map_draw_equation_.find(name);
if (pFind != map_draw_equation_.end())
{
odf_path_ = odf_path_.substr(0, pos) + pFind->second + odf_path_.substr(pos1);
pos += pFind->second.length() + 2 - (pos1 - pos);
}
}
}
// for (size_t i = 0; i < draw_handle_.size(); i++)
// {
//draw_handle * handle = dynamic_cast<draw_handle *>(draw_handle_[i].get());
@ -720,6 +758,7 @@ const wchar_t * dr3d_scene::name = L"scene";
void dr3d_scene::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
dr3d_attlist_.add_attributes(Attributes);
draw_shape::add_attributes(Attributes);
sub_type_ = 12;
@ -789,8 +828,8 @@ void dr3d_sphere::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
draw_shape::add_attributes(Attributes);
CP_APPLY_ATTR(L"dr3d:size", dr3d_size_); //vector3D
CP_APPLY_ATTR(L"dr3d:center", dr3d_center_); //vector3D
CP_APPLY_ATTR(L"dr3d:size", dr3d_size_);
CP_APPLY_ATTR(L"dr3d:center", dr3d_center_);
CP_APPLY_ATTR(L"dr3d:transform",dr3d_transform_);
sub_type_ = 16;

View File

@ -396,16 +396,16 @@ 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){}
draw_equation_attlist draw_equation_attlist_;
draw_equation_attlist attlist_;
};
CP_REGISTER_OFFICE_ELEMENT2(draw_equation);
////////////////
struct draw_handle_geometry
{
int min;
int max;
};
//struct draw_handle_geometry
//{
// int min;
// int max;
//};
//////////////////////////////////////////////////////
class draw_handle_attlist//убрать стринги ... сделать парсинг см стр 378 оазис !!!!!!!!!!!
{
@ -469,6 +469,8 @@ public:
static const ElementType type = typeDrawCustomShape;
static const xml::NodeType xml_type = xml::typeElement;
CPDOCCORE_DEFINE_VISITABLE();
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);
@ -476,29 +478,27 @@ public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
void find_draw_type_oox();
draw_enhanced_geometry_attlist attlist_;
draw_enhanced_geometry_attlist attlist_;
_CP_OPT(int) sub_type_;
_CP_OPT(int) draw_type_oox_index_;
_CP_OPT(std::wstring) svg_viewbox_;
bool word_art_;
bool bOoxType_;
typedef std::pair<std::wstring,std::wstring> pair_string_value;
std::vector<draw_handle_geometry> draw_handle_geometry_;
std::vector<pair_string_value> draw_equation_array_;
_CP_OPT(std::wstring) svg_viewbox_;
office_element_ptr_array draw_handle_;
office_element_ptr_array draw_equation_;
//-------------------------------------------------
static int parsing(_CP_OPT(std::wstring) val);
CPDOCCORE_DEFINE_VISITABLE();
friend class odf_document;
void find_draw_type_oox();
std::map<std::wstring, std::wstring> map_draw_equation_;
//std::vector<draw_handle_geometry> draw_handle_geometry_;
_CP_OPT(int) sub_type_;
_CP_OPT(int) draw_type_oox_index_;
bool word_art_;
bool bOoxType_;
std::wstring odf_path_;
};
CP_REGISTER_OFFICE_ELEMENT2(draw_enhanced_geometry);
@ -530,7 +530,6 @@ public:
virtual void pptx_convert(oox::pptx_conversion_context & Context);
draw_caption_attlist draw_caption_attlist_;
};
CP_REGISTER_OFFICE_ELEMENT2(draw_caption);
@ -585,6 +584,7 @@ public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
odf_types::common_dr3d_attlist dr3d_attlist_;
};
CP_REGISTER_OFFICE_ELEMENT2(dr3d_scene);
@ -692,9 +692,9 @@ public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
_CP_OPT(std::wstring) dr3d_size_; //vector3D
_CP_OPT(std::wstring) dr3d_center_; //vector3D
_CP_OPT(std::wstring) dr3d_transform_;
_CP_OPT(odf_types::vector3D) dr3d_size_;
_CP_OPT(odf_types::vector3D) dr3d_center_;
_CP_OPT(std::wstring) dr3d_transform_;
};
CP_REGISTER_OFFICE_ELEMENT2(dr3d_sphere);

View File

@ -312,13 +312,8 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
shape->sub_type_ = sub_type_.get();
set_shape = true;
}
std::wstring odf_path; //общая часть - объединить ...
if (attlist_.drawooo_enhanced_path_)
odf_path = attlist_.drawooo_enhanced_path_.get();
else if (attlist_.draw_enhanced_path_)
odf_path = attlist_.draw_enhanced_path_.get();
if (!odf_path.empty())
if (!odf_path_.empty())
{
std::vector<::svg_path::_polyline> o_Polyline;
@ -327,7 +322,7 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
try
{
res = ::svg_path::parseSvgD(o_Polyline, odf_path, true, bClosed);
res = ::svg_path::parseSvgD(o_Polyline, odf_path_, true, bClosed);
}
catch(...)
{

View File

@ -364,13 +364,7 @@ void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context
set_shape = true;
}
std::wstring odf_path;
if (attlist_.drawooo_enhanced_path_)
odf_path = attlist_.drawooo_enhanced_path_.get();
else if (attlist_.draw_enhanced_path_)
odf_path = attlist_.draw_enhanced_path_.get();
if (!odf_path.empty())
if (!odf_path_.empty())
{
std::vector<::svg_path::_polyline> o_Polyline;
@ -379,7 +373,7 @@ void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context
try
{
res = ::svg_path::parseSvgD(o_Polyline, odf_path, true, bClosed);
res = ::svg_path::parseSvgD(o_Polyline, odf_path_, true, bClosed);
}
catch(...)
{

View File

@ -297,14 +297,8 @@ void draw_enhanced_geometry::xlsx_convert(oox::xlsx_conversion_context & Context
{
Context.get_drawing_context().start_shape(sub_type_.get());
}
std::wstring odf_path;
if (attlist_.drawooo_enhanced_path_)
odf_path = attlist_.drawooo_enhanced_path_.get();
else if (attlist_.draw_enhanced_path_)
odf_path = attlist_.draw_enhanced_path_.get();
if (!odf_path.empty())
if (!odf_path_.empty())
{
std::vector<::svg_path::_polyline> o_Polyline;
@ -313,7 +307,7 @@ void draw_enhanced_geometry::xlsx_convert(oox::xlsx_conversion_context & Context
try
{
res = ::svg_path::parseSvgD(o_Polyline, odf_path, true, bClosed);
res = ::svg_path::parseSvgD(o_Polyline, odf_path_, true, bClosed);
}
catch(...)
{
@ -416,7 +410,6 @@ void draw_control::xlsx_convert(oox::xlsx_conversion_context & Context)
if (control->linked_cell_)
{
Context.get_drawing_context().set_property(_property(L"linked_cell", control->linked_cell_.get()));
}
if (control->disabled_)
@ -431,6 +424,11 @@ void draw_control::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_drawing_context().set_property(_property(L"value", control->current_value_.get()));
}
if (control->label_)
{
Context.get_drawing_context().set_property(_property(L"label", control->label_.get()));
Context.get_drawing_context().set_property(_property(L"text-content", control->label_.get()));
}
//if (control->name_)
//{
// Context.get_drawing_context().set_name(control->name_.get());
@ -474,6 +472,24 @@ void draw_control::xlsx_convert(oox::xlsx_conversion_context & Context)
Context.get_drawing_context().set_property(_property(L"list_source", combobox->list_source_.get()));
}
}
form_listbox* listbox = dynamic_cast<form_listbox*>(control);
if (listbox)
{
if (listbox->source_cell_range_)
{
Context.get_drawing_context().set_property(_property(L"cell_range", listbox->source_cell_range_.get()));
}
if (listbox->list_source_)
{
Context.get_drawing_context().set_property(_property(L"list_source", listbox->list_source_.get()));
}
}
form_checkbox* checkbox = dynamic_cast<form_checkbox*>(control);
if (checkbox)
{
Context.get_drawing_context().set_property(_property(L"checkbox_state", checkbox->current_state_));
}
//_CP_OPT(std::wstring) label_;
//_CP_OPT(std::wstring) title_;
//_CP_OPT(odf_types::Bool) dropdown_;

View File

@ -41,8 +41,6 @@ namespace cpdoccore {
namespace odf_reader {
// style-header-footer-properties-attlist
void style_header_footer_properties_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"svg:height", svg_height_);
@ -58,7 +56,7 @@ void style_header_footer_properties_attlist::add_attributes( const xml::attribut
CP_APPLY_ATTR(L"style:dynamic-spacing", style_dynamic_spacing_);
}
/// style-header-footer-properties
const wchar_t * style_header_footer_properties::ns = L"style";
const wchar_t * style_header_footer_properties::name = L"header-footer-properties";
@ -78,30 +76,10 @@ void style_header_footer_properties::add_child_element( xml::sax * Reader, const
not_applicable_element(L"style-header-footer-properties", Reader, Ns, Name);
}
}
// common-style-header-footer-attlist
void common_style_header_footer_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:display", style_display_, true);
}
// header-footer-content
std::wostream & header_footer_content::text_to_stream(std::wostream & _Wostream, bool bXmlEncode) const
{
serialize_elements_text(_Wostream, content_, bXmlEncode);
return _Wostream;
}
void header_footer_content::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name, document_context * Context)
{
if CP_CHECK_NAME(L"text", L"tracked-changes")
{
CP_CREATE_ELEMENT_SIMPLE(tracked_changes_);
}
else
CP_CREATE_ELEMENT_SIMPLE(content_);
}
}
}

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