Compare commits

...

269 Commits

Author SHA1 Message Date
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
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
8a7b6fbb2b Fix bug #42542 (#177) 2019-08-27 13:03:12 +03:00
6bd1d9b90b v5.3.5 2019-08-26 11:25:08 +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
5612c09b0c Disable xml errors on check svg 2019-07-23 15:16:11 +03:00
8926c52369 [x2t] Add pageSetUpPr to Editor.bin 2019-07-23 13:11:39 +03:00
b1d0b7aac7 . 2019-07-23 12:14:06 +03:00
923fbfcbe0 Linux build errors 2019-07-23 10:50:11 +03:00
fc6f8bdba9 Add building allthemesgen 2019-07-22 18:58:18 +03:00
e6da67b3e1 OdfFormatWriter - fix bug #42158 2019-07-22 17:43:57 +03:00
49fa17978d Themes generator developing... 2019-07-22 15:43:55 +03:00
61211fc08c OdfFormatWriter - fix bug #42098 2019-07-18 19:24:58 +03:00
8316861e00 Add themes generator 2019-07-18 14:25:43 +03:00
8ebf0c590a [ios][documents] update build for bitcode 2019-07-18 14:11:53 +03:00
3451d93b57 Dump themes thumbnails 2019-07-17 18:59:42 +03:00
f36ba68722 [x2t] Fix bug 42023 2019-07-17 18:19:09 +03:00
9a8a0a9bf2 Add allthemesgen 2019-07-17 17:59:51 +03:00
ae6d97ffd8 DocFormatReader -... 2019-07-17 17:51:54 +03:00
16ffb9cefd Change destdir & target name in allfontsgen project 2019-07-17 10:28:17 +03:00
92beed0782 [v8] Fix windows build 2019-07-16 16:37:34 +03:00
27e68c0fa7 v5.3.4 2019-07-16 15:20:41 +03:00
9cdd977367 [x2t] Fix writing commentsIds.xml to rels 2019-07-16 14:11:50 +03:00
6ad996780b x2t - fix bug #42070 2019-07-15 16:53:31 +03:00
bd0a2bcbd7 [x2t] Add timeZoneBias to Editor.bin; Fix GenerateInt 2019-07-12 20:22:53 +03:00
a4e2fcad31 [x2t] Generate comments Guids if they are absent 2019-07-11 19:45:35 +03:00
7e23508e06 DocxFormat - add altChunk 2019-07-11 19:17:39 +03:00
c9928f0929 [ios][formats] update OdfConverter 2019-07-11 17:04:29 +03:00
207549cc88 [ios][formats] update OdfConverter 2019-07-11 16:14:46 +03:00
a16d889984 OdfFormatReader - fix bug #41390 2019-07-11 15:52:52 +03:00
8600020fb0 [x2t] Add providerId to Editor.bin 2019-07-10 20:24:27 +03:00
8950201785 [x2t] Write both "table", "pivot" tableStyle attibutes 2019-07-10 20:22:30 +03:00
c600841902 fix bug #42048 2019-07-10 17:18:33 +03:00
1a3a73d0ec . 2019-07-10 14:57:44 +03:00
5a82c47fa0 [x2t] Fix build 2019-07-10 00:36:08 +03:00
65f7a4a170 Merge pull request #172 from ONLYOFFICE/feature/comments
Feature/comments
2019-07-09 20:03:59 +03:00
413424bf62 Merge hotfix/v5.3.3 into develop 2019-07-09 19:39:31 +03:00
41606e907a v5.3.3 2019-07-09 19:18:07 +03:00
01499a21f3 Fix mac timers (#170) 2019-07-09 16:06:10 +03:00
a9215a867b . 2019-07-08 18:22:22 +03:00
e9fd8205fa . 2019-07-08 17:06:27 +03:00
f30a3c4ae8 x2t - fix bug #42030 2019-07-08 13:17:44 +03:00
615179f9da [x2t] Add ThreadedComments to Editor.bin 2019-07-05 20:11:22 +03:00
2fc5a4f37a . 2019-07-05 12:15:34 +03:00
25af6b2ecf x2t - fix bug #41757 2019-07-05 12:02:41 +03:00
f0fdf9f86e [x2t] Add w16cid:commentsIds to Editor.bin 2019-07-04 14:20:37 +03:00
5d5e7bce72 Speed up cloning openssl (#169)
Before:
```
real    3m6,793s
user    0m28,249s
sys     0m5,641s
```

After:
```
real    0m13,834s
user    0m2,169s
sys     0m0,838s
```
2019-07-04 11:42:54 +03:00
58903d92e1 [ios][odfconverter] fix crash 2019-07-03 18:41:19 +03:00
b7ea6bb376 . 2019-07-03 16:49:36 +03:00
a1007d4522 . 2019-07-03 13:42:24 +03:00
4b68d3294c . 2019-07-02 16:12:51 +03:00
24b44f6b03 [x2t] Fix writing m:oMath inside w:hyperlink 2019-07-02 14:02:16 +03:00
9f20ee6fef . 2019-07-01 18:48:47 +03:00
14921ca98d Fix building for xp (#168) 2019-07-01 14:03:21 +03:00
663bf866ed . 2019-07-01 12:57:57 +03:00
4894639c09 Build icu with only xp target (#167) 2019-06-28 10:41:31 +03:00
2314452d5a [x2t] Fix build 2019-06-28 00:16:41 +03:00
22c8ae9d0e Merge pull request #166 from ONLYOFFICE/feature/sheet-data
Feature/sheet data
2019-06-27 20:25:29 +03:00
996fa5c84d [x2t] Fix <w:t> elem with run content inside(<w:t>6<w:cr/>6</w:t>) 2019-06-27 20:20:20 +03:00
59d2dd2840 . 2019-06-27 12:24:51 +03:00
3727c2e982 Fix boost download error 2019-06-26 18:53:10 +03:00
1b67ebe9a6 [s2t] Add some optimization for xls->Editor.bin convertion 2019-06-26 16:30:50 +03:00
967ab71adc XLsFormat - fix bug #41967 2019-06-26 15:37:01 +03:00
d7c7dadbba [x2t] Use one CCell object while xml->binary convertion 2019-06-25 20:22:24 +03:00
a48322f1cc [x2t] Fix CStreamBinaryWriter 2019-06-25 20:20:28 +03:00
bd41922f66 OdfFormatWriter - fix bug #41956 2019-06-25 17:55:49 +03:00
ccd73c8c68 [ios][x2t] fixed build 2019-06-25 15:33:38 +03:00
5b6659f816 [android][x2t] fix build 2019-06-25 14:40:02 +03:00
a5122a6a47 Remove inline flag (#165) 2019-06-24 18:34:22 +03:00
7a4cf11c62 [x2t] Revert some merged files in 2019-06-24 17:31:42 +03:00
9b9d7df4e2 Merge remote-tracking branch 'remotes/origin/hotfix/v5.3.3' into develop
# Conflicts:
#	Common/DocxFormat/Source/XlsxFormat/SharedStrings/Text.h
2019-06-24 15:05:16 +03:00
c9330ee0f1 Feature/bug 41890 (#164)
* [x2t] Decode xlsx escaped chars

* [x2t] Fix bug #41890, #36575. Add CStringBuilder::WriteEncodeXmlStringHHHH
2019-06-24 14:56:02 +03:00
2214362426 Fix boost download error 2019-06-24 14:51:39 +03:00
bdce91fccf Merge hotfix/v5.3.2 into develop 2019-06-21 18:38:23 +03:00
f9e35983f4 v5.3.2 2019-06-21 18:13:37 +03:00
dd65f70fcb [ios][x2t] add support bitcode 2019-06-21 16:23:32 +03:00
bf600c6eb0 Core/mac build (#161) 2019-06-21 12:54:00 +03:00
0db6728463 Fix 3rdparty building 2019-06-20 14:32:51 +03:00
03bccc6b10 [x2t] Fix CCell::parseRefA; Fix CSV opening 2019-06-20 11:58:16 +03:00
09c43b1179 Remove curl & add errors to bat files (#159) 2019-06-19 17:20:12 +03:00
e6134405cb Merge remote-tracking branch 'origin/feature/fix_v5.3.1' into develop 2019-06-19 12:22:30 +03:00
0499c6ff4f Merge pull request #158 from ONLYOFFICE/feature/binary-sheet-data
Feature/binary sheet data
2019-06-18 18:36:40 +03:00
1860c19539 [x2t] Fix Editor.bin->xlsx drawing convertion 2019-06-18 17:09:15 +03:00
2d5015bcf2 Revert "[x2t] Move c_oSerWorksheetsTypes::XlsbPos record in Editor.bin"
This reverts commit c0d16ed7c3.
2019-06-18 15:33:53 +03:00
390ab3bcc8 [ios] add constants (#157) 2019-06-18 13:46:28 +03:00
c0d16ed7c3 [x2t] Move c_oSerWorksheetsTypes::XlsbPos record in Editor.bin 2019-06-17 19:05:25 +03:00
075f70c220 Fix prefious commit (#156) 2019-06-17 16:17:14 +03:00
6abf1613ec Fix mac build (#155) 2019-06-17 15:58:07 +03:00
0abc21d4ee Merge pull request #154 from ONLYOFFICE/ios/fixed-build
Fix ios build
2019-06-17 14:13:41 +03:00
7a7cdab770 up 2019-06-17 14:10:11 +03:00
7c6218ccb5 [x2t] Add Cell::fromXMLtoXLSB for performance reasons. Add other fixes 2019-06-14 18:05:01 +03:00
34c5a4b3af [x2t] Improve performance on xlsx->Editor.bin convertion 2019-06-11 20:24:24 +03:00
9256b0f9a3 [x2t] Fixes 2019-06-10 20:09:52 +03:00
ce370581a8 [android] add system initialize path 2019-06-10 13:15:48 +03:00
39647894a8 [android] add system setup fonts 2019-06-10 13:06:05 +03:00
3d456bcc80 [x2t] Fixes 2019-06-07 20:04:11 +03:00
7ae3c6f2ea Fix bug with svg (#153) 2019-06-07 15:22:15 +03:00
404058354e [x2t] Write SheetData to to Editor.bin on xml reading 2019-06-06 20:21:18 +03:00
d398488f3d OdfFormatWriter - fix bug #41789 2019-06-06 13:50:37 +03:00
35bd2803a4 v5.3.1 2019-06-06 12:32:18 +03:00
c312a2b868 XlsFormat - fix bug #41779 2019-06-05 16:44:37 +03:00
08f75771b9 Merge pull request #151 from ONLYOFFICE/gutter
Gutter
2019-06-04 13:36:23 +03:00
060f695fb1 . 2019-06-03 18:15:53 +03:00
de3261521e Merge 5.3.1 => develop 2019-06-03 13:40:34 +03:00
e7bf661432 Fix bug #41495 (#149)
Fix the problem with rendering WMF files
2019-05-31 17:32:12 +03:00
6470a3a8a4 fix bug #38183 2019-05-30 19:13:26 +03:00
14aed88307 . 2019-05-30 12:54:19 +03:00
132f770d28 . 2019-05-29 20:12:21 +03:00
8f5318a9a2 . 2019-05-29 20:07:35 +03:00
635265eaa2 Feature/pre5.3.1 (#146)
* Fix bug with fonts installed not for all users

* Fix compilation error with gcc >=5

* Fix  build for xp
2019-05-29 15:29:19 +03:00
038a687d01 . 2019-05-28 17:03:39 +03:00
69e8ea6f4b . 2019-05-28 13:33:10 +03:00
1393de8057 v5.3.0 2019-05-27 17:21:45 +03:00
7636ff79cc v5.3.0 2019-05-27 17:05:18 +03:00
2092aef589 [ios][odf] fixed build 2019-05-27 13:58:50 +03:00
eff937699b . 2019-05-27 13:39:25 +03:00
3efc1f0432 [ios][x2t] fixed build 2019-05-27 13:01:12 +03:00
69fee1ae0b . 2019-05-23 20:03:25 +03:00
a0cc6b6274 OdfFormatWriter - ...; fix vml comment 2019-05-23 17:28:24 +03:00
31eb395858 OdfFormat - ... 2019-05-21 19:05:00 +03:00
ed1019a004 Not writing transparency group in pdfa mode 2019-05-20 17:09:22 +03:00
4e554d128a Merge pull request #143 from ONLYOFFICE/feature/tester
Feature/tester
2019-05-20 14:39:17 +03:00
b8d441a327 Fix remove exe 2019-05-20 14:34:24 +03:00
8fb809bf4a tester 2019-05-20 14:22:26 +03:00
cabf6ab32a [x2t] Add Gutter to Editor.bin
For bug 40990
2019-05-20 13:57:14 +03:00
35c4d70cf5 Fix bug 41615 2019-05-20 11:57:52 +03:00
58952393f0 OdfFormat - data validations 2019-05-19 17:12:43 +03:00
688d5972ea [x2t] Change write order to Editor.bin 2019-05-17 20:00:11 +03:00
81176e851c [x2t] Add PageSetup properties to Editor.bin 2019-05-17 19:55:47 +03:00
0b987aeed2 Add variable for xp support 2019-05-17 15:00:16 +03:00
c7315e2f21 OdfFormatReader -... 2019-05-16 19:43:29 +03:00
aefb229343 [x2t] Fix typo (Core props) 2019-05-16 18:25:10 +03:00
ac080b3485 Merge commit 'eb9d69d1ec6f23036a820992cd1957463851ef04' into develop 2019-05-16 15:41:55 +03:00
eb9d69d1ec Fix svg bug 2019-05-15 19:28:02 +03:00
eb4ffee9e7 OdfFormat - ... 2019-05-15 19:07:34 +03:00
763347d8ec OdfFormatWriter -.. 2019-05-15 16:35:29 +03:00
9670d021c2 x2t - fix bug #41503 2019-05-14 19:22:20 +03:00
232115e684 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-05-14 14:08:38 +03:00
79f18355fe x2t - fix bug #41515 2019-05-13 15:27:03 +03:00
f86055c713 Epub images bug (xml files) 2019-05-08 12:51:29 +03:00
ea82bea6f1 . 2019-04-29 15:21:20 +03:00
28f5b1251a XlsxFormat - fix bug #41458 2019-04-29 14:20:41 +03:00
39fbf06511 PptFormatReader - fix bug #40482 2019-04-29 14:20:41 +03:00
a265d82dda Merge remote-tracking branch 'origin/feature/fix_v5.3' into develop 2019-04-27 17:30:36 +03:00
e68b550d1e OdfFormatReader - fix bug #41408 2019-04-27 17:14:31 +03:00
0821edca07 OdfFormatReader - fix bug #41408 2019-04-27 16:26:46 +03:00
bc4faa26b9 Fix linux build 2019-04-26 17:06:30 +03:00
668a89bbd1 Merge pull request #132 from ONLYOFFICE/feature/svg
Feature/svg
2019-04-26 16:50:48 +03:00
832d35dc17 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-26 16:39:58 +03:00
2d21d334cf OdfFormatReader - fix bug #41408 2019-04-26 16:36:56 +03:00
b23bc97fdb Fix bugs 2019-04-25 18:26:02 +03:00
f4df80ebf3 OdfFormatReader - fix bug #41409 2019-04-25 17:30:06 +03:00
799fcbc342 [ios][x2t] fixed build 2019-04-24 15:39:43 +03:00
1d25f72ac9 SVG full support 2019-04-24 14:14:34 +03:00
9bfb0321b2 svg position support 2019-04-24 11:45:07 +03:00
6c1bdc6ff8 . 2019-04-23 19:27:56 +03:00
469ce9aafb [ios][x2t] fixed build 2019-04-23 18:07:50 +03:00
8f8995cbe7 . 2019-04-23 11:00:39 +03:00
fb1ae2c79a . 2019-04-23 10:45:51 +03:00
0f4d594248 . 2019-04-22 18:56:37 +03:00
152d05d5a5 . 2019-04-22 18:40:22 +03:00
5c070f0475 . 2019-04-22 16:50:53 +03:00
ab45804644 . 2019-04-19 18:50:12 +03:00
5f7288f66f . 2019-04-19 17:41:29 +03:00
b308f53e76 . 2019-04-19 14:45:55 +03:00
0982b8fb11 OdfFormatWriter - .. 2019-04-18 20:01:12 +03:00
4cca54900d . 2019-04-18 18:46:34 +03:00
b66ed403e1 . 2019-04-18 18:22:08 +03:00
692fe69426 OdfFormatWriter - controls 2019-04-18 12:24:36 +03:00
428b5971e8 . 2019-04-17 18:55:31 +03:00
5bb1de7dbd Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-17 13:29:49 +03:00
6c29f811d9 x2t - fixed bug #40823 2019-04-15 14:15:57 +03:00
89ac698d35 . 2019-04-15 11:30:23 +03:00
e1d910f952 . 2019-04-13 12:04:23 +03:00
5bb3ca6aff Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2019-04-12 18:38:53 +03:00
bae655ba49 GetTickCount on MacOS 2019-04-12 18:38:42 +03:00
e4b4949471 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-12 18:32:21 +03:00
2bfcfbf21c . 2019-04-12 18:31:41 +03:00
1266382747 . 2019-04-12 14:17:34 +03:00
966809a8f2 x2t - bin - read/write activeX(convert to control) 2019-04-11 17:15:29 +03:00
27c9b40ad3 [ios][x2t] fixed build 2019-04-05 11:53:33 +03:00
699eb731b4 x2t - bin - form controls read/write 2019-04-04 20:02:26 +03:00
0eb032a281 . 2019-04-04 15:38:02 +03:00
f89174ded5 . 2019-04-04 14:02:02 +03:00
ff1d53637a x2t - bin - writing xlsx controls 2019-04-02 18:44:10 +03:00
e825b4359f Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-04-02 17:14:46 +03:00
25022ceecc XlsxFormat - ctrlProps 2019-04-01 18:25:53 +03:00
1a7476e465 x2t - XlsxFormat - fix bug #40316 - queryTables, connections, dataValidations 2019-03-31 17:19:47 +03:00
0edc2729e8 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-28 12:23:48 +03:00
d51f004b11 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-27 13:49:34 +03:00
79aa50d712 [x2t] Add OutlineLevelCol, OutlineLevelRow to Editor.bin 2019-03-25 19:56:24 +03:00
fdef699b9b [ios][x2t] fixed build 2019-03-25 15:14:24 +03:00
8573513168 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-20 18:53:57 +03:00
b9608771a9 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-15 14:51:35 +03:00
cfea717d20 XlsxFormat - dataValidation (+x14) 2019-03-14 19:53:11 +03:00
0ec79f2c2d . 2019-03-14 13:46:42 +03:00
6f0d22c3a4 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-14 12:06:08 +03:00
8d074cadf8 OdfFormatReader - ... 2019-03-14 12:04:44 +03:00
195e9079db Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-13 19:09:19 +03:00
b60811fd0d DocxFormat - read/write ooxml chart_ex 2019-03-13 16:30:09 +03:00
6d6cbd51c3 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-12 15:50:06 +03:00
9c1b107998 Merge remote-tracking branch 'origin/release/v5.3.0' into develop 2019-03-07 18:31:50 +03:00
f2e003b12c [ios][pe] spellcheck 2019-03-07 18:15:22 +03:00
ee43592691 OdfFormatReader - chart user shapes from odf chart group 2019-03-06 19:02:38 +03:00
00328e88b2 [ios] spellcheck 2019-03-05 17:27:02 +03:00
564b7f9c29 v5.2.8 2019-02-05 16:23:16 +03:00
515 changed files with 50786 additions and 16702 deletions

3
.gitignore vendored
View File

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

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,6 +60,7 @@ namespace DocFileFormat
std::wstring m_UserInitials;
unsigned short m_AuthorIndex;
int m_BookmarkId;
int m_CommentId;
};
class AnnotationReferenceExDescriptor: public ByteStructure

View File

@ -82,6 +82,7 @@ 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]);
@ -92,14 +93,17 @@ namespace DocFileFormat
}
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 ));
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::SizeTToWideString(atrdPre10->m_CommentId));
//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());

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;
@ -800,8 +800,9 @@ namespace DocFileFormat
}
}
XMLTools::XMLElement elem(L"w:br");
elem.AppendAttribute(L"w:type", L"textWrapping");
elem.AppendAttribute(L"w:clear", L"all");
//СЗ в МРФ Техноград о предоставлении ТП 1 квартал 2019_MO_Q31.doc
//elem.AppendAttribute(L"w:type", L"textWrapping");
//elem.AppendAttribute(L"w:clear", L"all");
m_pXmlWriter->WriteString(elem.GetXMLString());
}
@ -892,12 +893,16 @@ namespace DocFileFormat
}
else if ((TextMark::Symbol == code) && fSpec)
{
writeNotesReferences(cp);//for word95 & non-automatic notes
Symbol s = getSymbol( chpx );
//m_pXmlWriter->WriteNodeBegin(L"w:sym", true);
//m_pXmlWriter->WriteAttribute(L"w:font", FormatUtils::XmlEncode(s.FontName));
//m_pXmlWriter->WriteAttribute(L"w:char", FormatUtils::XmlEncode(s.HexValue));
//m_pXmlWriter->WriteNodeEnd(L"", true);
//<w:sym w:font="Symbol" w:char="F062"/>
m_pXmlWriter->WriteNodeBegin(L"w:sym", true);
m_pXmlWriter->WriteAttribute(L"w:font", FormatUtils::XmlEncode(s.FontName));
m_pXmlWriter->WriteAttribute(L"w:char", FormatUtils::XmlEncode(s.HexValue));
m_pXmlWriter->WriteNodeEnd(L"", true);
}
else if ((TextMark::DrawnObject == code) && fSpec)
{
@ -1035,39 +1040,7 @@ namespace DocFileFormat
}
else if ((TextMark::AutoNumberedFootnoteReference == code) && fSpec)
{
if ((m_document->FootnoteReferenceCharactersPlex != NULL) && (m_document->FootnoteReferenceCharactersPlex->IsCpExists(cp)))
{
m_pXmlWriter->WriteNodeBegin( L"w:footnoteReference", true );
FootnoteDescriptor* desc = dynamic_cast<FootnoteDescriptor*>(m_document->FootnoteReferenceCharactersPlex->Elements[_footnoteNr]);
if (desc && desc->aFtnIdx == 0)
{
m_pXmlWriter->WriteAttribute( L"w:customMarkFollows", L"1");
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString(_footnoteNr++ ) );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
else if ((m_document->IndividualFootnotesPlex != NULL) && (m_document->IndividualFootnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpText)))
{
m_pXmlWriter->WriteNodeBegin( L"w:footnoteRef", true );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
else if ((m_document->EndnoteReferenceCharactersPlex != NULL) && (m_document->EndnoteReferenceCharactersPlex->IsCpExists(cp)))
{
m_pXmlWriter->WriteNodeBegin( L"w:endnoteReference", true );
EndnoteDescriptor* desc = dynamic_cast<EndnoteDescriptor*>(m_document->EndnoteReferenceCharactersPlex->Elements[_endnoteNr]);
if (desc && desc->aEndIdx == 0)
{
m_pXmlWriter->WriteAttribute( L"w:customMarkFollows", L"1");
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString(_endnoteNr++ ));
m_pXmlWriter->WriteNodeEnd( L"", true );
}
else if ((m_document->IndividualEndnotesPlex != NULL) &&
(m_document->IndividualEndnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpAtn - m_document->FIB->m_RgLw97.ccpHdr - m_document->FIB->m_RgLw97.ccpFtn - m_document->FIB->m_RgLw97.ccpText)))
{
m_pXmlWriter->WriteNodeBegin( L"w:endnoteRef", true );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
writeNotesReferences(cp);
}
else if (TextMark::AnnotationReference == code)
{
@ -1076,23 +1049,44 @@ 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 );
}
}
else if (!FormatUtils::IsControlSymbol(c) && ((int)c != 0xFFFF))
{
writeNotesReferences(cp);//for word95 & non-automatic notes
text += FormatUtils::GetXMLSymbol(c);
}
@ -1378,6 +1372,7 @@ namespace DocFileFormat
fEndNestingLevel = ( iter->Arguments[0] == 1 ) ? (true) : (false);
}break;
case sprmOldPFInTable:
case sprmPItap:
{
iTap_current = FormatUtils::BytesToUInt32( iter->Arguments, 0, iter->argumentsSize );
@ -1418,7 +1413,7 @@ namespace DocFileFormat
}
}
}
if (nestingLevel > 1 && fEndNestingLevel && !boundaries.empty())
if (nestingLevel != iTap_current && fEndNestingLevel && !boundaries.empty())
break;
//get the next papx
papx = findValidPapx( fcRowEnd );
@ -1764,7 +1759,51 @@ namespace DocFileFormat
return cpCellEnd;
}
bool DocumentMapping::writeNotesReferences(int cp)
{
if ((m_document->FootnoteReferenceCharactersPlex != NULL) && (m_document->FootnoteReferenceCharactersPlex->IsCpExists(cp)))
{
FootnoteDescriptor* desc = dynamic_cast<FootnoteDescriptor*>(m_document->FootnoteReferenceCharactersPlex->Elements[_footnoteNr]);
if ((desc) && (false == desc->bUsed))
{
desc->bUsed = true;
m_pXmlWriter->WriteNodeBegin( L"w:footnoteReference", true );
if (desc->aFtnIdx == 0)
{
m_pXmlWriter->WriteAttribute( L"w:customMarkFollows", L"1");
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString(_footnoteNr++ ) );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
}
else if ((m_document->IndividualFootnotesPlex != NULL) && (m_document->IndividualFootnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpText)))
{
m_pXmlWriter->WriteNodeBegin( L"w:footnoteRef", true );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
else if ((m_document->EndnoteReferenceCharactersPlex != NULL) && (m_document->EndnoteReferenceCharactersPlex->IsCpExists(cp)))
{
EndnoteDescriptor* desc = dynamic_cast<EndnoteDescriptor*>(m_document->EndnoteReferenceCharactersPlex->Elements[_endnoteNr]);
if ((desc) && (false == desc->bUsed))
{
desc->bUsed = true;
m_pXmlWriter->WriteNodeBegin( L"w:endnoteReference", true );
if (desc->aEndIdx == 0)
{
m_pXmlWriter->WriteAttribute( L"w:customMarkFollows", L"1");
}
m_pXmlWriter->WriteAttribute( L"w:id", FormatUtils::IntToWideString(_endnoteNr++ ));
m_pXmlWriter->WriteNodeEnd( L"", true );
}
}
else if ((m_document->IndividualEndnotesPlex != NULL) &&
(m_document->IndividualEndnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpAtn - m_document->FIB->m_RgLw97.ccpHdr - m_document->FIB->m_RgLw97.ccpFtn - m_document->FIB->m_RgLw97.ccpText)))
{
m_pXmlWriter->WriteNodeBegin( L"w:endnoteRef", true );
m_pXmlWriter->WriteNodeEnd( L"", true );
}
return true;
}
bool DocumentMapping::writeBookmarks(int cp)
{
bool result = true;
@ -1791,16 +1830,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);
}
}
@ -1907,7 +1962,7 @@ namespace DocFileFormat
FontFamilyName* ffn = static_cast<FontFamilyName*>( m_document->FontTable->operator [] ( fontIndex ) );
ret.FontName = ffn->xszFtn;
ret.HexValue = FormatUtils::IntToFormattedWideString( code, L"%04x" );
ret.HexValue = FormatUtils::IntToFormattedWideString( code, L"%04X" );
break;
}

View File

@ -121,6 +121,8 @@ namespace DocFileFormat
bool writeBookmarkStart ( short id );
bool writeBookmarkEnd ( short id );
bool writeNotesReferences(int cp);
bool writeAnnotations ( int cp );
bool writeAnnotationStart( short id );
bool writeAnnotationEnd ( short id );

View File

@ -40,7 +40,7 @@ namespace DocFileFormat
public:
static const int STRUCTURE_SIZE = 2;
EndnoteDescriptor(): aEndIdx(0) {}
EndnoteDescriptor(): aEndIdx(0), bUsed(false) {}
virtual ~EndnoteDescriptor()
{
@ -54,6 +54,7 @@ namespace DocFileFormat
return static_cast<ByteStructure*>( newObject );
}
bool bUsed;
short aEndIdx;
};
}

View File

@ -41,7 +41,7 @@ namespace DocFileFormat
public:
static const int STRUCTURE_SIZE = 2;
FootnoteDescriptor() : aFtnIdx(0) {}
FootnoteDescriptor() : aFtnIdx(0), bUsed(false) {}
virtual ~FootnoteDescriptor()
{
@ -56,5 +56,6 @@ namespace DocFileFormat
}
short aFtnIdx;
bool bUsed;
};
}

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

@ -75,7 +75,7 @@ namespace DocFileFormat
void TableCellPropertiesMapping::Apply (IVisitable* visited)
{
TablePropertyExceptions* tapx = static_cast<TablePropertyExceptions*>(visited);
int nComputedCellWidth = 0;
int nComputedCellWidth = 0, nComputedCellWidths = 0;
_gridSpan = 0;
_bCoverCell = false;
@ -164,7 +164,11 @@ namespace DocFileFormat
else
{
_gridSpan = 1;
nComputedCellWidth += tdef.rgdxaCenter[ _cellIndex + 1] - tdef.rgdxaCenter[ _cellIndex ] ;
nComputedCellWidths += (tdef.rgdxaCenter[ _cellIndex + 1] - tdef.rgdxaCenter[ 0 ]);
nComputedCellWidth += tdef.rgTc80[ _cellIndex].wWidth > 1 ? tdef.rgTc80[ _cellIndex].wWidth : (tdef.rgdxaCenter[ _cellIndex + 1] - tdef.rgdxaCenter[ _cellIndex ]);
//Технические_Требования_1_287_ДИТ.DOC
}
if (!IsTableBordersDefined(tapx->grpprl))
@ -348,19 +352,22 @@ namespace DocFileFormat
tcW.AppendAttribute( tcWVal );
_tcPr->AppendChild( tcW );
int nComputedCellWidthsGrid = 0;
if ( _gridSpan == 1 && ( _gridIndex < (int)_grid->size() ) && ( nComputedCellWidth > _grid->at( _gridIndex ) ) )
for (size_t ccc = 0; ccc < _grid->size() && ccc <= _gridIndex; ccc++)
{
nComputedCellWidthsGrid += _grid->at(ccc);
}
if ( _gridSpan == 1 && ( _gridIndex < (int)_grid->size() ) && ( nComputedCellWidths > nComputedCellWidthsGrid ) )
{
//check the number of merged cells
int w = _grid->at( _gridIndex );
for ( size_t i = _gridIndex + 1; i < _grid->size(); i++ )
{
_gridSpan++;
w += _grid->at( i );
nComputedCellWidthsGrid += _grid->at( i );
if ( w >= nComputedCellWidth )
if ( nComputedCellWidthsGrid >= nComputedCellWidths )
{
break;
}

View File

@ -1280,7 +1280,7 @@ namespace DocFileFormat
for (size_t i = 0; i < pWrapPolygonVertices->complex.data.size(); ++i)
{
coords += FormatUtils::IntToWideString(pWrapPolygonVertices->complex.data[i++].x);
coords += FormatUtils::IntToWideString(pWrapPolygonVertices->complex.data[i].x);
coords += L",";
coords += FormatUtils::IntToWideString(pWrapPolygonVertices->complex.data[i].y);
coords += L",";

View File

@ -297,10 +297,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);
@ -361,7 +362,7 @@ 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);
@ -373,15 +374,26 @@ namespace DocFileFormat
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);
}
}
}

View File

@ -171,8 +171,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

View File

@ -29,9 +29,6 @@
6967B4D41E27C52700A129E2 /* ListTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4271E27C52700A129E2 /* ListTable.cpp */; };
6967B4D51E27C52700A129E2 /* MainDocumentMapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4291E27C52700A129E2 /* MainDocumentMapping.cpp */; };
6967B4D61E27C52700A129E2 /* NumberingMapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B42C1E27C52700A129E2 /* NumberingMapping.cpp */; };
6967B4D71E27C52700A129E2 /* Record.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4471E27C52700A129E2 /* Record.cpp */; };
6967B4D81E27C52700A129E2 /* RecordFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4491E27C52700A129E2 /* RecordFactory.cpp */; };
6967B4D91E27C52700A129E2 /* ShapeTypeFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4511E27C52700A129E2 /* ShapeTypeFactory.cpp */; };
6967B4DA1E27C52700A129E2 /* OleObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B47A1E27C52700A129E2 /* OleObject.cpp */; };
6967B4DB1E27C52700A129E2 /* OpenXmlPackage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B47D1E27C52700A129E2 /* OpenXmlPackage.cpp */; };
6967B4DC1E27C52700A129E2 /* ParagraphHeight.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B47F1E27C52700A129E2 /* ParagraphHeight.cpp */; };
@ -60,6 +57,9 @@
6967B4F31E27C52700A129E2 /* VMLShapeTypeMapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4BC1E27C52700A129E2 /* VMLShapeTypeMapping.cpp */; };
6967B4F41E27C52700A129E2 /* WordDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4BF1E27C52700A129E2 /* WordDocument.cpp */; };
6967B4F51E27C52700A129E2 /* WordprocessingDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6967B4C11E27C52700A129E2 /* WordprocessingDocument.cpp */; };
8A1BC15322DF34920084799E /* ShapeTypeFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A1BC11622DF34900084799E /* ShapeTypeFactory.cpp */; };
8A1BC15422DF34920084799E /* Record.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A1BC14922DF34920084799E /* Record.cpp */; };
8A1BC15522DF34920084799E /* RecordFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A1BC15222DF34920084799E /* RecordFactory.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -166,79 +166,6 @@
6967B42C1E27C52700A129E2 /* NumberingMapping.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NumberingMapping.cpp; sourceTree = "<group>"; };
6967B42D1E27C52700A129E2 /* NumberingMapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberingMapping.h; sourceTree = "<group>"; };
6967B42E1E27C52700A129E2 /* OfficeArtContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OfficeArtContent.h; sourceTree = "<group>"; };
6967B4301E27C52700A129E2 /* BitmapBlip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitmapBlip.h; sourceTree = "<group>"; };
6967B4311E27C52700A129E2 /* BlipStoreContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlipStoreContainer.h; sourceTree = "<group>"; };
6967B4321E27C52700A129E2 /* BlipStoreEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlipStoreEntry.h; sourceTree = "<group>"; };
6967B4331E27C52700A129E2 /* ChildAnchor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChildAnchor.h; sourceTree = "<group>"; };
6967B4341E27C52700A129E2 /* ClientAnchor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClientAnchor.h; sourceTree = "<group>"; };
6967B4351E27C52700A129E2 /* ClientData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClientData.h; sourceTree = "<group>"; };
6967B4361E27C52700A129E2 /* DiagramBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiagramBooleanProperties.h; sourceTree = "<group>"; };
6967B4371E27C52700A129E2 /* DrawingContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingContainer.h; sourceTree = "<group>"; };
6967B4381E27C52700A129E2 /* DrawingGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingGroup.h; sourceTree = "<group>"; };
6967B4391E27C52700A129E2 /* DrawingGroupRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingGroupRecord.h; sourceTree = "<group>"; };
6967B43A1E27C52700A129E2 /* DrawingRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingRecord.h; sourceTree = "<group>"; };
6967B43B1E27C52700A129E2 /* FillStyleBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FillStyleBooleanProperties.h; sourceTree = "<group>"; };
6967B43C1E27C52700A129E2 /* GeometryBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeometryBooleanProperties.h; sourceTree = "<group>"; };
6967B43D1E27C52700A129E2 /* GeometryTextBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeometryTextBooleanProperties.h; sourceTree = "<group>"; };
6967B43E1E27C52700A129E2 /* GroupContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupContainer.h; sourceTree = "<group>"; };
6967B43F1E27C52700A129E2 /* GroupShapeBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupShapeBooleanProperties.h; sourceTree = "<group>"; };
6967B4401E27C52700A129E2 /* GroupShapeRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupShapeRecord.h; sourceTree = "<group>"; };
6967B4411E27C52700A129E2 /* LineStyleBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineStyleBooleanProperties.h; sourceTree = "<group>"; };
6967B4421E27C52700A129E2 /* MetafilePictBlip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MetafilePictBlip.h; sourceTree = "<group>"; };
6967B4431E27C52700A129E2 /* OfficeArtClientTextbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OfficeArtClientTextbox.h; sourceTree = "<group>"; };
6967B4441E27C52700A129E2 /* PathParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathParser.h; sourceTree = "<group>"; };
6967B4451E27C52700A129E2 /* PathSegment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathSegment.h; sourceTree = "<group>"; };
6967B4461E27C52700A129E2 /* ProtectionBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProtectionBooleanProperties.h; sourceTree = "<group>"; };
6967B4471E27C52700A129E2 /* Record.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Record.cpp; sourceTree = "<group>"; };
6967B4481E27C52700A129E2 /* Record.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Record.h; sourceTree = "<group>"; };
6967B4491E27C52700A129E2 /* RecordFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RecordFactory.cpp; sourceTree = "<group>"; };
6967B44A1E27C52700A129E2 /* RecordFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecordFactory.h; sourceTree = "<group>"; };
6967B44B1E27C52700A129E2 /* RegularContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegularContainer.h; sourceTree = "<group>"; };
6967B44C1E27C52700A129E2 /* ShadowStyleBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShadowStyleBooleanProperties.h; sourceTree = "<group>"; };
6967B44D1E27C52700A129E2 /* Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shape.h; sourceTree = "<group>"; };
6967B44E1E27C52700A129E2 /* ShapeContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeContainer.h; sourceTree = "<group>"; };
6967B44F1E27C52700A129E2 /* ShapeOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeOptions.h; sourceTree = "<group>"; };
6967B4501E27C52700A129E2 /* ShapeType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeType.h; sourceTree = "<group>"; };
6967B4511E27C52700A129E2 /* ShapeTypeFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShapeTypeFactory.cpp; sourceTree = "<group>"; };
6967B4521E27C52700A129E2 /* ShapeTypeFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeTypeFactory.h; sourceTree = "<group>"; };
6967B4541E27C52700A129E2 /* ArcType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArcType.h; sourceTree = "<group>"; };
6967B4551E27C52700A129E2 /* ArrowType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrowType.h; sourceTree = "<group>"; };
6967B4561E27C52700A129E2 /* BevelType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BevelType.h; sourceTree = "<group>"; };
6967B4571E27C52700A129E2 /* BlockArcType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockArcType.h; sourceTree = "<group>"; };
6967B4581E27C52700A129E2 /* BracketsType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BracketsType.h; sourceTree = "<group>"; };
6967B4591E27C52700A129E2 /* CalloutsType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CalloutsType.h; sourceTree = "<group>"; };
6967B45A1E27C52700A129E2 /* CanType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanType.h; sourceTree = "<group>"; };
6967B45B1E27C52700A129E2 /* Connector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Connector.h; sourceTree = "<group>"; };
6967B45C1E27C52700A129E2 /* CubeType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CubeType.h; sourceTree = "<group>"; };
6967B45D1E27C52700A129E2 /* DiamondType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiamondType.h; sourceTree = "<group>"; };
6967B45E1E27C52700A129E2 /* DonutType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DonutType.h; sourceTree = "<group>"; };
6967B45F1E27C52700A129E2 /* FlowChartType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlowChartType.h; sourceTree = "<group>"; };
6967B4601E27C52700A129E2 /* FoldedCornerlType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FoldedCornerlType.h; sourceTree = "<group>"; };
6967B4611E27C52700A129E2 /* HeartType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeartType.h; sourceTree = "<group>"; };
6967B4621E27C52700A129E2 /* HexagonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HexagonType.h; sourceTree = "<group>"; };
6967B4631E27C52700A129E2 /* IsoscelesTriangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IsoscelesTriangleType.h; sourceTree = "<group>"; };
6967B4641E27C52700A129E2 /* LightningBoltType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LightningBoltType.h; sourceTree = "<group>"; };
6967B4651E27C52700A129E2 /* LineType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineType.h; sourceTree = "<group>"; };
6967B4661E27C52700A129E2 /* MoonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoonType.h; sourceTree = "<group>"; };
6967B4671E27C52700A129E2 /* NoSmokingType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoSmokingType.h; sourceTree = "<group>"; };
6967B4681E27C52700A129E2 /* OctagonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OctagonType.h; sourceTree = "<group>"; };
6967B4691E27C52700A129E2 /* OvalType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OvalType.h; sourceTree = "<group>"; };
6967B46A1E27C52700A129E2 /* ParallelogramType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParallelogramType.h; sourceTree = "<group>"; };
6967B46B1E27C52700A129E2 /* PentagonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PentagonType.h; sourceTree = "<group>"; };
6967B46C1E27C52700A129E2 /* PictureFrameType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PictureFrameType.h; sourceTree = "<group>"; };
6967B46D1E27C52700A129E2 /* PlaqueType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlaqueType.h; sourceTree = "<group>"; };
6967B46E1E27C52700A129E2 /* PlusType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlusType.h; sourceTree = "<group>"; };
6967B46F1E27C52700A129E2 /* RectangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RectangleType.h; sourceTree = "<group>"; };
6967B4701E27C52700A129E2 /* RightTriangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RightTriangleType.h; sourceTree = "<group>"; };
6967B4711E27C52700A129E2 /* RoundedRectangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoundedRectangleType.h; sourceTree = "<group>"; };
6967B4721E27C52700A129E2 /* SmileyFaceType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmileyFaceType.h; sourceTree = "<group>"; };
6967B4731E27C52700A129E2 /* StarType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StarType.h; sourceTree = "<group>"; };
6967B4741E27C52700A129E2 /* SunType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SunType.h; sourceTree = "<group>"; };
6967B4751E27C52700A129E2 /* TextboxType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextboxType.h; sourceTree = "<group>"; };
6967B4761E27C52700A129E2 /* TrapezoidType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrapezoidType.h; sourceTree = "<group>"; };
6967B4771E27C52700A129E2 /* WordArtText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WordArtText.h; sourceTree = "<group>"; };
6967B4781E27C52700A129E2 /* SplitMenuColorContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplitMenuColorContainer.h; sourceTree = "<group>"; };
6967B4791E27C52700A129E2 /* UnknownRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnknownRecord.h; sourceTree = "<group>"; };
6967B47A1E27C52700A129E2 /* OleObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OleObject.cpp; sourceTree = "<group>"; };
6967B47B1E27C52700A129E2 /* OleObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OleObject.h; sourceTree = "<group>"; };
6967B47C1E27C52700A129E2 /* OleObjectMapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OleObjectMapping.h; sourceTree = "<group>"; };
@ -312,6 +239,71 @@
6967B4C01E27C52700A129E2 /* WordDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WordDocument.h; sourceTree = "<group>"; };
6967B4C11E27C52700A129E2 /* WordprocessingDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WordprocessingDocument.cpp; sourceTree = "<group>"; };
6967B4C21E27C52700A129E2 /* WordprocessingDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WordprocessingDocument.h; sourceTree = "<group>"; };
8A1BC11122DF348F0084799E /* ClientAnchor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClientAnchor.h; sourceTree = "<group>"; };
8A1BC11222DF34900084799E /* ShapeTypeFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeTypeFactory.h; sourceTree = "<group>"; };
8A1BC11322DF34900084799E /* OfficeArtClientTextbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OfficeArtClientTextbox.h; sourceTree = "<group>"; };
8A1BC11422DF34900084799E /* DiagramBooleanProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiagramBooleanProperties.h; sourceTree = "<group>"; };
8A1BC11522DF34900084799E /* MetafilePictBlip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MetafilePictBlip.h; sourceTree = "<group>"; };
8A1BC11622DF34900084799E /* ShapeTypeFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShapeTypeFactory.cpp; sourceTree = "<group>"; };
8A1BC11722DF34900084799E /* DrawingContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingContainer.h; sourceTree = "<group>"; };
8A1BC11822DF34900084799E /* UnknownRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnknownRecord.h; sourceTree = "<group>"; };
8A1BC11922DF34900084799E /* Record.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Record.h; sourceTree = "<group>"; };
8A1BC11A22DF34900084799E /* BitmapBlip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitmapBlip.h; sourceTree = "<group>"; };
8A1BC11B22DF34910084799E /* OfficeArtFRITContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OfficeArtFRITContainer.h; sourceTree = "<group>"; };
8A1BC11C22DF34910084799E /* DrawingGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingGroup.h; sourceTree = "<group>"; };
8A1BC11D22DF34910084799E /* ShapeContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeContainer.h; sourceTree = "<group>"; };
8A1BC11E22DF34910084799E /* ShapeType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeType.h; sourceTree = "<group>"; };
8A1BC12022DF34910084799E /* PlaqueType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlaqueType.h; sourceTree = "<group>"; };
8A1BC12122DF34910084799E /* CubeType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CubeType.h; sourceTree = "<group>"; };
8A1BC12222DF34910084799E /* LightningBoltType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LightningBoltType.h; sourceTree = "<group>"; };
8A1BC12322DF34910084799E /* OvalType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OvalType.h; sourceTree = "<group>"; };
8A1BC12422DF34910084799E /* CalloutsType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CalloutsType.h; sourceTree = "<group>"; };
8A1BC12522DF34910084799E /* TextboxType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextboxType.h; sourceTree = "<group>"; };
8A1BC12622DF34910084799E /* HexagonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HexagonType.h; sourceTree = "<group>"; };
8A1BC12722DF34910084799E /* NoSmokingType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoSmokingType.h; sourceTree = "<group>"; };
8A1BC12822DF34910084799E /* OctagonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OctagonType.h; sourceTree = "<group>"; };
8A1BC12922DF34910084799E /* ArcType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArcType.h; sourceTree = "<group>"; };
8A1BC12A22DF34910084799E /* CanType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanType.h; sourceTree = "<group>"; };
8A1BC12B22DF34910084799E /* PictureFrameType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PictureFrameType.h; sourceTree = "<group>"; };
8A1BC12C22DF34910084799E /* BevelType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BevelType.h; sourceTree = "<group>"; };
8A1BC12D22DF34910084799E /* MoonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoonType.h; sourceTree = "<group>"; };
8A1BC12E22DF34910084799E /* FoldedCornerlType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FoldedCornerlType.h; sourceTree = "<group>"; };
8A1BC12F22DF34910084799E /* PentagonType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PentagonType.h; sourceTree = "<group>"; };
8A1BC13022DF34910084799E /* BracketsType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BracketsType.h; sourceTree = "<group>"; };
8A1BC13122DF34910084799E /* IsoscelesTriangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IsoscelesTriangleType.h; sourceTree = "<group>"; };
8A1BC13222DF34910084799E /* StarType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StarType.h; sourceTree = "<group>"; };
8A1BC13322DF34910084799E /* DonutType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DonutType.h; sourceTree = "<group>"; };
8A1BC13422DF34910084799E /* RectangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RectangleType.h; sourceTree = "<group>"; };
8A1BC13522DF34910084799E /* TrapezoidType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrapezoidType.h; sourceTree = "<group>"; };
8A1BC13622DF34910084799E /* ArrowType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrowType.h; sourceTree = "<group>"; };
8A1BC13722DF34910084799E /* SmileyFaceType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmileyFaceType.h; sourceTree = "<group>"; };
8A1BC13822DF34910084799E /* PlusType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlusType.h; sourceTree = "<group>"; };
8A1BC13922DF34910084799E /* RightTriangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RightTriangleType.h; sourceTree = "<group>"; };
8A1BC13A22DF34910084799E /* HeartType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeartType.h; sourceTree = "<group>"; };
8A1BC13B22DF34910084799E /* SunType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SunType.h; sourceTree = "<group>"; };
8A1BC13C22DF34910084799E /* Connector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Connector.h; sourceTree = "<group>"; };
8A1BC13D22DF34910084799E /* RoundedRectangleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoundedRectangleType.h; sourceTree = "<group>"; };
8A1BC13E22DF34910084799E /* BlockArcType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockArcType.h; sourceTree = "<group>"; };
8A1BC13F22DF34910084799E /* WordArtText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WordArtText.h; sourceTree = "<group>"; };
8A1BC14022DF34910084799E /* FlowChartType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlowChartType.h; sourceTree = "<group>"; };
8A1BC14122DF34910084799E /* LineType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineType.h; sourceTree = "<group>"; };
8A1BC14222DF34910084799E /* DiamondType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiamondType.h; sourceTree = "<group>"; };
8A1BC14322DF34910084799E /* ParallelogramType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParallelogramType.h; sourceTree = "<group>"; };
8A1BC14422DF34910084799E /* ClientData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClientData.h; sourceTree = "<group>"; };
8A1BC14522DF34910084799E /* GroupShapeRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupShapeRecord.h; sourceTree = "<group>"; };
8A1BC14622DF34910084799E /* Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shape.h; sourceTree = "<group>"; };
8A1BC14722DF34910084799E /* BlipStoreEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlipStoreEntry.h; sourceTree = "<group>"; };
8A1BC14822DF34920084799E /* DrawingGroupRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingGroupRecord.h; sourceTree = "<group>"; };
8A1BC14922DF34920084799E /* Record.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Record.cpp; sourceTree = "<group>"; };
8A1BC14A22DF34920084799E /* SplitMenuColorContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplitMenuColorContainer.h; sourceTree = "<group>"; };
8A1BC14B22DF34920084799E /* ShapeOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeOptions.h; sourceTree = "<group>"; };
8A1BC14C22DF34920084799E /* RegularContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegularContainer.h; sourceTree = "<group>"; };
8A1BC14D22DF34920084799E /* BlipStoreContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlipStoreContainer.h; sourceTree = "<group>"; };
8A1BC14E22DF34920084799E /* RecordFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecordFactory.h; sourceTree = "<group>"; };
8A1BC14F22DF34920084799E /* DrawingRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingRecord.h; sourceTree = "<group>"; };
8A1BC15022DF34920084799E /* GroupContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupContainer.h; sourceTree = "<group>"; };
8A1BC15122DF34920084799E /* ChildAnchor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChildAnchor.h; sourceTree = "<group>"; };
8A1BC15222DF34920084799E /* RecordFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RecordFactory.cpp; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -541,87 +533,79 @@
6967B42F1E27C52700A129E2 /* OfficeDrawing */ = {
isa = PBXGroup;
children = (
6967B4301E27C52700A129E2 /* BitmapBlip.h */,
6967B4311E27C52700A129E2 /* BlipStoreContainer.h */,
6967B4321E27C52700A129E2 /* BlipStoreEntry.h */,
6967B4331E27C52700A129E2 /* ChildAnchor.h */,
6967B4341E27C52700A129E2 /* ClientAnchor.h */,
6967B4351E27C52700A129E2 /* ClientData.h */,
6967B4361E27C52700A129E2 /* DiagramBooleanProperties.h */,
6967B4371E27C52700A129E2 /* DrawingContainer.h */,
6967B4381E27C52700A129E2 /* DrawingGroup.h */,
6967B4391E27C52700A129E2 /* DrawingGroupRecord.h */,
6967B43A1E27C52700A129E2 /* DrawingRecord.h */,
6967B43B1E27C52700A129E2 /* FillStyleBooleanProperties.h */,
6967B43C1E27C52700A129E2 /* GeometryBooleanProperties.h */,
6967B43D1E27C52700A129E2 /* GeometryTextBooleanProperties.h */,
6967B43E1E27C52700A129E2 /* GroupContainer.h */,
6967B43F1E27C52700A129E2 /* GroupShapeBooleanProperties.h */,
6967B4401E27C52700A129E2 /* GroupShapeRecord.h */,
6967B4411E27C52700A129E2 /* LineStyleBooleanProperties.h */,
6967B4421E27C52700A129E2 /* MetafilePictBlip.h */,
6967B4431E27C52700A129E2 /* OfficeArtClientTextbox.h */,
6967B4441E27C52700A129E2 /* PathParser.h */,
6967B4451E27C52700A129E2 /* PathSegment.h */,
6967B4461E27C52700A129E2 /* ProtectionBooleanProperties.h */,
6967B4471E27C52700A129E2 /* Record.cpp */,
6967B4481E27C52700A129E2 /* Record.h */,
6967B4491E27C52700A129E2 /* RecordFactory.cpp */,
6967B44A1E27C52700A129E2 /* RecordFactory.h */,
6967B44B1E27C52700A129E2 /* RegularContainer.h */,
6967B44C1E27C52700A129E2 /* ShadowStyleBooleanProperties.h */,
6967B44D1E27C52700A129E2 /* Shape.h */,
6967B44E1E27C52700A129E2 /* ShapeContainer.h */,
6967B44F1E27C52700A129E2 /* ShapeOptions.h */,
6967B4501E27C52700A129E2 /* ShapeType.h */,
6967B4511E27C52700A129E2 /* ShapeTypeFactory.cpp */,
6967B4521E27C52700A129E2 /* ShapeTypeFactory.h */,
6967B4531E27C52700A129E2 /* Shapetypes */,
6967B4781E27C52700A129E2 /* SplitMenuColorContainer.h */,
6967B4791E27C52700A129E2 /* UnknownRecord.h */,
8A1BC11A22DF34900084799E /* BitmapBlip.h */,
8A1BC14D22DF34920084799E /* BlipStoreContainer.h */,
8A1BC14722DF34910084799E /* BlipStoreEntry.h */,
8A1BC15122DF34920084799E /* ChildAnchor.h */,
8A1BC11122DF348F0084799E /* ClientAnchor.h */,
8A1BC14422DF34910084799E /* ClientData.h */,
8A1BC11422DF34900084799E /* DiagramBooleanProperties.h */,
8A1BC11722DF34900084799E /* DrawingContainer.h */,
8A1BC11C22DF34910084799E /* DrawingGroup.h */,
8A1BC14822DF34920084799E /* DrawingGroupRecord.h */,
8A1BC14F22DF34920084799E /* DrawingRecord.h */,
8A1BC15022DF34920084799E /* GroupContainer.h */,
8A1BC14522DF34910084799E /* GroupShapeRecord.h */,
8A1BC11522DF34900084799E /* MetafilePictBlip.h */,
8A1BC11322DF34900084799E /* OfficeArtClientTextbox.h */,
8A1BC11B22DF34910084799E /* OfficeArtFRITContainer.h */,
8A1BC14922DF34920084799E /* Record.cpp */,
8A1BC11922DF34900084799E /* Record.h */,
8A1BC15222DF34920084799E /* RecordFactory.cpp */,
8A1BC14E22DF34920084799E /* RecordFactory.h */,
8A1BC14C22DF34920084799E /* RegularContainer.h */,
8A1BC14622DF34910084799E /* Shape.h */,
8A1BC11D22DF34910084799E /* ShapeContainer.h */,
8A1BC14B22DF34920084799E /* ShapeOptions.h */,
8A1BC11E22DF34910084799E /* ShapeType.h */,
8A1BC11622DF34900084799E /* ShapeTypeFactory.cpp */,
8A1BC11222DF34900084799E /* ShapeTypeFactory.h */,
8A1BC11F22DF34910084799E /* Shapetypes */,
8A1BC14A22DF34920084799E /* SplitMenuColorContainer.h */,
8A1BC11822DF34900084799E /* UnknownRecord.h */,
);
path = OfficeDrawing;
sourceTree = "<group>";
};
6967B4531E27C52700A129E2 /* Shapetypes */ = {
8A1BC11F22DF34910084799E /* Shapetypes */ = {
isa = PBXGroup;
children = (
6967B4541E27C52700A129E2 /* ArcType.h */,
6967B4551E27C52700A129E2 /* ArrowType.h */,
6967B4561E27C52700A129E2 /* BevelType.h */,
6967B4571E27C52700A129E2 /* BlockArcType.h */,
6967B4581E27C52700A129E2 /* BracketsType.h */,
6967B4591E27C52700A129E2 /* CalloutsType.h */,
6967B45A1E27C52700A129E2 /* CanType.h */,
6967B45B1E27C52700A129E2 /* Connector.h */,
6967B45C1E27C52700A129E2 /* CubeType.h */,
6967B45D1E27C52700A129E2 /* DiamondType.h */,
6967B45E1E27C52700A129E2 /* DonutType.h */,
6967B45F1E27C52700A129E2 /* FlowChartType.h */,
6967B4601E27C52700A129E2 /* FoldedCornerlType.h */,
6967B4611E27C52700A129E2 /* HeartType.h */,
6967B4621E27C52700A129E2 /* HexagonType.h */,
6967B4631E27C52700A129E2 /* IsoscelesTriangleType.h */,
6967B4641E27C52700A129E2 /* LightningBoltType.h */,
6967B4651E27C52700A129E2 /* LineType.h */,
6967B4661E27C52700A129E2 /* MoonType.h */,
6967B4671E27C52700A129E2 /* NoSmokingType.h */,
6967B4681E27C52700A129E2 /* OctagonType.h */,
6967B4691E27C52700A129E2 /* OvalType.h */,
6967B46A1E27C52700A129E2 /* ParallelogramType.h */,
6967B46B1E27C52700A129E2 /* PentagonType.h */,
6967B46C1E27C52700A129E2 /* PictureFrameType.h */,
6967B46D1E27C52700A129E2 /* PlaqueType.h */,
6967B46E1E27C52700A129E2 /* PlusType.h */,
6967B46F1E27C52700A129E2 /* RectangleType.h */,
6967B4701E27C52700A129E2 /* RightTriangleType.h */,
6967B4711E27C52700A129E2 /* RoundedRectangleType.h */,
6967B4721E27C52700A129E2 /* SmileyFaceType.h */,
6967B4731E27C52700A129E2 /* StarType.h */,
6967B4741E27C52700A129E2 /* SunType.h */,
6967B4751E27C52700A129E2 /* TextboxType.h */,
6967B4761E27C52700A129E2 /* TrapezoidType.h */,
6967B4771E27C52700A129E2 /* WordArtText.h */,
8A1BC12022DF34910084799E /* PlaqueType.h */,
8A1BC12122DF34910084799E /* CubeType.h */,
8A1BC12222DF34910084799E /* LightningBoltType.h */,
8A1BC12322DF34910084799E /* OvalType.h */,
8A1BC12422DF34910084799E /* CalloutsType.h */,
8A1BC12522DF34910084799E /* TextboxType.h */,
8A1BC12622DF34910084799E /* HexagonType.h */,
8A1BC12722DF34910084799E /* NoSmokingType.h */,
8A1BC12822DF34910084799E /* OctagonType.h */,
8A1BC12922DF34910084799E /* ArcType.h */,
8A1BC12A22DF34910084799E /* CanType.h */,
8A1BC12B22DF34910084799E /* PictureFrameType.h */,
8A1BC12C22DF34910084799E /* BevelType.h */,
8A1BC12D22DF34910084799E /* MoonType.h */,
8A1BC12E22DF34910084799E /* FoldedCornerlType.h */,
8A1BC12F22DF34910084799E /* PentagonType.h */,
8A1BC13022DF34910084799E /* BracketsType.h */,
8A1BC13122DF34910084799E /* IsoscelesTriangleType.h */,
8A1BC13222DF34910084799E /* StarType.h */,
8A1BC13322DF34910084799E /* DonutType.h */,
8A1BC13422DF34910084799E /* RectangleType.h */,
8A1BC13522DF34910084799E /* TrapezoidType.h */,
8A1BC13622DF34910084799E /* ArrowType.h */,
8A1BC13722DF34910084799E /* SmileyFaceType.h */,
8A1BC13822DF34910084799E /* PlusType.h */,
8A1BC13922DF34910084799E /* RightTriangleType.h */,
8A1BC13A22DF34910084799E /* HeartType.h */,
8A1BC13B22DF34910084799E /* SunType.h */,
8A1BC13C22DF34910084799E /* Connector.h */,
8A1BC13D22DF34910084799E /* RoundedRectangleType.h */,
8A1BC13E22DF34910084799E /* BlockArcType.h */,
8A1BC13F22DF34910084799E /* WordArtText.h */,
8A1BC14022DF34910084799E /* FlowChartType.h */,
8A1BC14122DF34910084799E /* LineType.h */,
8A1BC14222DF34910084799E /* DiamondType.h */,
8A1BC14322DF34910084799E /* ParallelogramType.h */,
);
path = Shapetypes;
sourceTree = "<group>";
@ -667,6 +651,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
);
mainGroup = 6967B2E21E27C23A00A129E2;
@ -687,7 +672,6 @@
6967B4D11E27C52700A129E2 /* LanguageIdMapping.cpp in Sources */,
6967B4E61E27C52700A129E2 /* SinglePropertyModifier.cpp in Sources */,
6967B4C91E27C52700A129E2 /* EncryptionHeader.cpp in Sources */,
6967B4D71E27C52700A129E2 /* Record.cpp in Sources */,
6967B4ED1E27C52700A129E2 /* TableMapping.cpp in Sources */,
6967B4F31E27C52700A129E2 /* VMLShapeTypeMapping.cpp in Sources */,
6967B4E31E27C52700A129E2 /* RevisionData.cpp in Sources */,
@ -699,18 +683,18 @@
6967B4E21E27C52700A129E2 /* PropertyExceptions.cpp in Sources */,
6967B4C31E27C52700A129E2 /* AnnotationReferenceDescriptor.cpp in Sources */,
6967B4D31E27C52700A129E2 /* ListLevel.cpp in Sources */,
8A1BC15322DF34920084799E /* ShapeTypeFactory.cpp in Sources */,
6967B4CB1E27C52700A129E2 /* FontTableMapping.cpp in Sources */,
6967B4EC1E27C52700A129E2 /* TableCellPropertiesMapping.cpp in Sources */,
6967B4D81E27C52700A129E2 /* RecordFactory.cpp in Sources */,
6967B4C61E27C52700A129E2 /* DocumentMapping.cpp in Sources */,
6967B4CA1E27C52700A129E2 /* FontFamilyName.cpp in Sources */,
6967B4F21E27C52700A129E2 /* VMLShapeMapping.cpp in Sources */,
6967B4C71E27C52700A129E2 /* DocumentProperties.cpp in Sources */,
6967B4EF1E27C52700A129E2 /* TableRowPropertiesMapping.cpp in Sources */,
8A1BC15422DF34920084799E /* Record.cpp in Sources */,
6967B4E01E27C52700A129E2 /* PieceTable.cpp in Sources */,
6967B4E81E27C52700A129E2 /* StyleSheet.cpp in Sources */,
6967B4EA1E27C52700A129E2 /* StyleSheetInformation.cpp in Sources */,
6967B4D91E27C52700A129E2 /* ShapeTypeFactory.cpp in Sources */,
6967B4D01E27C52700A129E2 /* HeaderMapping.cpp in Sources */,
6967B4DA1E27C52700A129E2 /* OleObject.cpp in Sources */,
6967B4D61E27C52700A129E2 /* NumberingMapping.cpp in Sources */,
@ -724,6 +708,7 @@
6967B4C51E27C52700A129E2 /* Converter.cpp in Sources */,
6967B4E91E27C52700A129E2 /* StyleSheetDescription.cpp in Sources */,
6967B4E41E27C52700A129E2 /* SectionPropertiesMapping.cpp in Sources */,
8A1BC15522DF34920084799E /* RecordFactory.cpp in Sources */,
6967B4EE1E27C52700A129E2 /* TablePropertiesMapping.cpp in Sources */,
6967B4D51E27C52700A129E2 /* MainDocumentMapping.cpp in Sources */,
6967B4E51E27C52700A129E2 /* SettingsMapping.cpp in Sources */,
@ -835,16 +820,6 @@
isa = XCBuildConfiguration;
buildSettings = {
DEVELOPMENT_TEAM = 2WH24U26GJ;
GCC_PREPROCESSOR_DEFINITIONS = (
UNICODE,
_UNICODE,
_USE_XMLLITE_READER_,
USE_LITE_READER,
USE_ATL_CSTRING,
_USE_LIBXML2_READER_,
LIBXML_READER_ENABLED,
_IOS,
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
@ -866,16 +841,6 @@
isa = XCBuildConfiguration;
buildSettings = {
DEVELOPMENT_TEAM = 2WH24U26GJ;
GCC_PREPROCESSOR_DEFINITIONS = (
UNICODE,
_UNICODE,
_USE_XMLLITE_READER_,
USE_LITE_READER,
USE_ATL_CSTRING,
_USE_LIBXML2_READER_,
LIBXML_READER_ENABLED,
_IOS,
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,

View File

@ -41,6 +41,8 @@ namespace Writers
static std::wstring g_string_comment_End = _T("</w:comments>");
static std::wstring g_string_commentExt_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w15:commentsEx xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 w15 wp14\">");
static std::wstring g_string_commentExt_End = _T("</w15:commentsEx>");
static std::wstring g_string_commentsIds_Start = _T("<w16cid:commentsIds mc:Ignorable=\"w16cid\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\">");
static std::wstring g_string_commentsIds_End = _T("</w16cid:commentsIds>");
static std::wstring g_string_people_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w15:people xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 w15 wp14\">");
static std::wstring g_string_people_End = _T("</w15:people>");
@ -50,21 +52,25 @@ namespace Writers
public:
std::wstring m_sComment;
std::wstring m_sCommentExt;
std::wstring m_sCommentsIds;
std::wstring m_sPeople;
std::wstring m_sDocumentComment;
std::wstring m_sDocumentCommentExt;
std::wstring m_sDocumentCommentsIds;
std::wstring m_sDocumentPeople;
CommentsWriter(std::wstring sDir) : m_sDir(sDir)
{
}
void setElements(std::wstring& sComment, std::wstring& sCommentExt, std::wstring& sPeople, std::wstring& sDocumentComment, std::wstring& sDocumentCommentExt, std::wstring& sDocumentPeople)
void setElements(std::wstring& sComment, std::wstring& sCommentExt, std::wstring& sCommentsIds, std::wstring& sPeople, std::wstring& sDocumentComment, std::wstring& sDocumentCommentExt, std::wstring& sDocumentCommentsIds, std::wstring& sDocumentPeople)
{
m_sComment = sComment;
m_sCommentExt = sCommentExt;
m_sCommentsIds = sCommentsIds;
m_sPeople = sPeople;
m_sDocumentComment = sDocumentComment;
m_sDocumentCommentExt = sDocumentCommentExt;
m_sDocumentCommentsIds = sDocumentCommentsIds;
m_sDocumentPeople = sDocumentPeople;
}
void Write()
@ -90,6 +96,15 @@ namespace Writers
oFile.WriteStringUTF8(g_string_commentExt_End);
oFile.CloseFile();
}
if(false == m_sCommentsIds.empty())
{
NSFile::CFileBinary oFile;
oFile.CreateFileW(sDir + OOX::FileTypes::CommentsIds.DefaultFileName().GetPath());
oFile.WriteStringUTF8(g_string_commentsIds_Start);
oFile.WriteStringUTF8(m_sCommentsIds);
oFile.WriteStringUTF8(g_string_commentsIds_End);
oFile.CloseFile();
}
if(false == m_sPeople.empty())
{
NSFile::CFileBinary oFile;
@ -120,6 +135,15 @@ namespace Writers
oFile.WriteStringUTF8(g_string_commentExt_End);
oFile.CloseFile();
}
if(false == m_sDocumentCommentsIds.empty())
{
NSFile::CFileBinary oFile;
oFile.CreateFileW(sDir + OOX::FileTypes::DocumentCommentsIds.DefaultFileName().GetPath());
oFile.WriteStringUTF8(g_string_commentsIds_Start);
oFile.WriteStringUTF8(m_sDocumentCommentsIds);
oFile.WriteStringUTF8(g_string_commentsIds_End);
oFile.CloseFile();
}
if(false == m_sDocumentPeople.empty())
{
NSFile::CFileBinary oFile;

View File

@ -62,6 +62,8 @@ public:
std::wstring pgBorders;
std::wstring footnotePr;
std::wstring endnotePr;
bool RtlGutter;
long Gutter;
bool bW;
bool bH;
@ -76,6 +78,8 @@ public:
bool bEvenAndOddHeaders;
bool bSectionType;
bool bPageNumStart;
bool bRtlGutter;
bool bGutter;
SectPr()
{
sHeaderFooterReference = _T("");
@ -94,6 +98,7 @@ public:
bEvenAndOddHeaders = false;
bSectionType = false;
bPageNumStart = false;
bRtlGutter = false;
}
std::wstring Write()
{
@ -152,7 +157,9 @@ public:
sRes += L" w:header=\"" + std::to_wstring(Header) + L"\"";
if(bFooter)
sRes += L" w:footer=\"" + std::to_wstring(Footer) + L"\"";
sRes += L" w:gutter=\"0\"/>";
if(bGutter)
sRes += L" w:gutter=\"" + std::to_wstring(Gutter) + L"\"";
sRes += L"/>";
}
if(!pgBorders.empty())
sRes += pgBorders;
@ -160,6 +167,14 @@ public:
if(bPageNumStart)
sRes += L"<w:pgNumType w:start=\"" + std::to_wstring(PageNumStart) + L"\"/>";
if(bRtlGutter)
{
if(RtlGutter)
sRes += L"<w:rtlGutter/>";
else
sRes += L"<w:rtlGutter w:val=\"0\"/>";
}
if(!cols.empty())
sRes += cols;
sRes += L"<w:docGrid w:linePitch=\"360\"/>";
@ -1481,14 +1496,25 @@ public:
std::wstring sFormat;
switch(Format)
{
case numbering_numfmt_None:sFormat = _T("none");break;
case numbering_numfmt_Bullet:sFormat = _T("bullet");break;
case numbering_numfmt_Decimal:sFormat = _T("decimal");break;
case numbering_numfmt_LowerRoman:sFormat = _T("lowerRoman");break;
case numbering_numfmt_UpperRoman:sFormat = _T("upperRoman");break;
case numbering_numfmt_LowerLetter:sFormat = _T("lowerLetter");break;
case numbering_numfmt_UpperLetter:sFormat = _T("upperLetter");break;
case numbering_numfmt_DecimalZero:sFormat = _T("decimalZero");break;
case numbering_numfmt_None: sFormat = L"none"; break;
case numbering_numfmt_Bullet: sFormat = L"bullet"; break;
case numbering_numfmt_Decimal: sFormat = L"decimal"; break;
case numbering_numfmt_LowerRoman: sFormat = L"lowerRoman"; break;
case numbering_numfmt_UpperRoman: sFormat = L"upperRoman"; break;
case numbering_numfmt_LowerLetter: sFormat = L"lowerLetter"; break;
case numbering_numfmt_UpperLetter: sFormat = L"upperLetter"; break;
case numbering_numfmt_DecimalZero: sFormat = L"decimalZero"; break;
default:
{
Format -= 0x2008;
if (Format >= 0)
{
SimpleTypes::CNumberFormat<> numFormat;
numFormat.SetValue((SimpleTypes::ENumberFormat)Format);
sFormat = numFormat.ToString();
}
}break;
}
if(!sFormat.empty())
{
@ -1876,10 +1902,13 @@ public:
int IdOpen;
int IdFormat;
std::wstring UserName;
std::wstring Initials;
std::wstring UserId;
std::wstring ProviderId;
std::wstring Date;
std::wstring OOData;
bool Solved;
unsigned int DurableId;
std::wstring Text;
std::wstring m_sParaId;
std::wstring m_sParaIdParent;
@ -1888,12 +1917,14 @@ public:
bool bIdOpen;
bool bIdFormat;
bool bSolved;
bool bDurableId;
public:
CComment(IdCounter& oParaIdCounter, IdCounter& oFormatIdCounter):m_oParaIdCounter(oParaIdCounter),m_oFormatIdCounter(oFormatIdCounter)
{
bIdOpen = false;
bIdFormat = false;
bSolved = false;
bDurableId = false;
}
~CComment()
{
@ -1930,15 +1961,6 @@ public:
}
return sRes;
}
std::wstring writeTemplates(bool isExt)
{
std::wstring sRes;
sRes += isExt ? writeContentExt(this) : writeContent(this);
for(size_t i = 0; i < replies.size(); ++i)
sRes += isExt ? writeContentExt(replies[i]) : writeContent(replies[i]);
return sRes;
}
static std::wstring writeRef(CComment* pComment, const std::wstring& sBefore, const std::wstring& sRef, const std::wstring& sAfter)
{
std::wstring sRes;
@ -1952,7 +1974,7 @@ public:
sRes += (sAfter);
return sRes;
}
static bool writeContentWritePart(CComment* pComment, std::wstring& sText, int nPrevIndex, int nCurIndex, bool bFirst, std::wstring& sRes)
static void writeContentWritePart(CComment* pComment, std::wstring& sText, int nPrevIndex, int nCurIndex, std::wstring& sRes)
{
std::wstring sPart;
if(nPrevIndex < nCurIndex)
@ -1960,17 +1982,11 @@ public:
int nId = pComment->m_oParaIdCounter.getNextId();
std::wstring sId = XmlUtils::IntToString(nId, L"%08X");
if(bFirst)
{
bFirst = false;
pComment->m_sParaId = sId;
}
sRes += L"<w:p w14:paraId=\"" + sId + L"\" w14:textId=\"" + sId + L"\">";
pComment->m_sParaId = XmlUtils::IntToString(nId, L"%08X");
sRes += L"<w:p w14:paraId=\"" + pComment->m_sParaId + L"\" w14:textId=\"" + pComment->m_sParaId + L"\">";
sRes += L"<w:pPr><w:spacing w:line=\"240\" w:after=\"0\" w:lineRule=\"auto\" w:before=\"0\"/><w:ind w:firstLine=\"0\" w:left=\"0\" w:right=\"0\"/><w:jc w:val=\"left\"/></w:pPr><w:r><w:rPr><w:rFonts w:eastAsia=\"Arial\" w:ascii=\"Arial\" w:hAnsi=\"Arial\" w:cs=\"Arial\"/><w:sz w:val=\"22\"/></w:rPr><w:t xml:space=\"preserve\">";
sRes += sPart;
sRes += L"</w:t></w:r></w:p>";
return bFirst;
}
static std::wstring writeContent(CComment* pComment)
{
@ -1981,22 +1997,12 @@ public:
pComment->IdFormat = pComment->m_oFormatIdCounter.getNextId();
}
sRes += L"<w:comment w:id=\"" + std::to_wstring(pComment->IdFormat) + L"\"";
std::wstring sInitials;
if(false == pComment->UserName.empty())
{
std::wstring sUserName = XmlUtils::EncodeXmlString(pComment->UserName);
sRes += L" w:author=\"";
sRes += (sUserName);
sRes += L"\"";
//делаем initials
std::vector<std::wstring> arSplit;
boost::algorithm::split(arSplit, pComment->UserName, boost::algorithm::is_any_of(L" "), boost::algorithm::token_compress_on);
for (size_t i = 0; i < arSplit.size(); i++)
{
sInitials += arSplit[i][0];
}
sRes += L"\"";
}
if(false == pComment->Date.empty())
{
@ -2012,11 +2018,10 @@ public:
sRes += sData;
sRes += L"\"";
}
if(false == sInitials.empty())
if(false == pComment->Initials.empty())
{
sInitials = XmlUtils::EncodeXmlString(sInitials);
sRes += L" w:initials=\"";
sRes += sInitials;
sRes += XmlUtils::EncodeXmlString(pComment->Initials);
sRes += L"\"";
}
sRes += L">";
@ -2024,18 +2029,17 @@ public:
XmlUtils::replace_all(sText, L"\r", L"");
bool bFirst = true;
int nPrevIndex = 0;
for (int i = 0; i < (int)sText.length(); i++)
{
wchar_t cToken = sText[i];
if('\n' == cToken)
{
bFirst = writeContentWritePart(pComment, sText, nPrevIndex, i, bFirst, sRes);
writeContentWritePart(pComment, sText, nPrevIndex, i, sRes);
nPrevIndex = i + 1;
}
}
writeContentWritePart(pComment, sText, nPrevIndex, (int)sText.length(), bFirst, sRes);
writeContentWritePart(pComment, sText, nPrevIndex, (int)sText.length(), sRes);
sRes += L"</w:comment>";
return sRes;
}
@ -2058,18 +2062,32 @@ w15:paraIdParent=\"" + pComment->m_sParaIdParent + L"\" w15:done=\"" + sDone + L
}
return sRes;
}
static std::wstring writeContentsIds(CComment* pComment)
{
std::wstring sRes;
if(!pComment->m_sParaId.empty() && pComment->bDurableId)
{
sRes += L"<w16cid:commentId w16cid:paraId=\"" + pComment->m_sParaId + L"\" w16cid:durableId=\"" + XmlUtils::IntToString(pComment->DurableId, L"%08X") + L"\"/>";
}
return sRes;
}
static std::wstring writePeople(CComment* pComment)
{
std::wstring sRes;
if(false == pComment->UserName.empty() && false == pComment->UserId.empty())
if(false == pComment->UserName.empty())
{
std::wstring sUserName = XmlUtils::EncodeXmlString(pComment->UserName);
std::wstring sUserId = XmlUtils::EncodeXmlString(pComment->UserId);
sRes += L"<w15:person w15:author=\"";
sRes += sUserName;
sRes += L"\"><w15:presenceInfo w15:providerId=\"Teamlab\" w15:userId=\"";
sRes += sUserId;
sRes += L"\"/></w15:person>";
sRes += XmlUtils::EncodeXmlString(pComment->UserName);
sRes += L"\">";
if(!pComment->ProviderId.empty() && !pComment->UserId.empty())
{
sRes += L"<w15:presenceInfo w15:providerId=\"";
sRes += XmlUtils::EncodeXmlString(pComment->ProviderId);
sRes += L"\" w15:userId=\"";
sRes += XmlUtils::EncodeXmlString(pComment->UserId);
sRes += L"\"/>";
}
sRes += L"</w15:person>";
}
return sRes;
}
@ -2125,7 +2143,9 @@ public:
std::wstring sRes;
for (boost::unordered_map<int, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it)
{
sRes += it->second->writeTemplates(false);
sRes += CComment::writeContent(it->second);
for(size_t i = 0; i < it->second->replies.size(); ++i)
sRes += CComment::writeContent(it->second->replies[i]);
}
return sRes;
}
@ -2134,7 +2154,20 @@ public:
std::wstring sRes;
for (boost::unordered_map<int, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it)
{
sRes += it->second->writeTemplates(true);
sRes += CComment::writeContentExt(it->second);
for(size_t i = 0; i < it->second->replies.size(); ++i)
sRes += CComment::writeContentExt(it->second->replies[i]);
}
return sRes;
}
std::wstring writeContentsIds()
{
std::wstring sRes;
for (boost::unordered_map<int, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it)
{
sRes += CComment::writeContentsIds(it->second);
for(size_t i = 0; i < it->second->replies.size(); ++i)
sRes += CComment::writeContentsIds(it->second->replies[i]);
}
return sRes;
}

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
@ -1397,6 +1402,11 @@ int Binary_pPrReader::Read_SecPr(BYTE type, long length, void* poResult)
READ1_DEF(length, res, this->ReadEndnotePr, &oEdnProps);
pSectPr->endnotePr = oEdnProps.toXML();
}
else if( c_oSerProp_secPrType::rtlGutter == type )
{
pSectPr->bRtlGutter = true;
pSectPr->RtlGutter = m_oBufferedStream.GetBool();
}
else
res = c_oSerConstants::ReadUnknown;
return res;
@ -1592,6 +1602,11 @@ int Binary_pPrReader::Read_pgMar(BYTE type, long length, void* poResult)
pSectPr->bFooter = true;
pSectPr->Footer = m_oBufferedStream.GetLong();
}
else if( c_oSer_pgMarType::GutterTwips == type )
{
pSectPr->bGutter = true;
pSectPr->Gutter = m_oBufferedStream.GetLong();
}
else
res = c_oSerConstants::ReadUnknown;
return res;
@ -3364,11 +3379,20 @@ int Binary_CommentsTableReader::ReadCommentContent(BYTE type, long length, void*
std::wstring UserName(m_oBufferedStream.GetString3(length));
pComment->UserName = UserName;
}
else if ( c_oSer_CommentsType::Initials == type )
{
pComment->Initials = m_oBufferedStream.GetString3(length);
}
else if ( c_oSer_CommentsType::UserId == type )
{
std::wstring UserId(m_oBufferedStream.GetString3(length));
pComment->UserId = UserId;
}
else if ( c_oSer_CommentsType::ProviderId == type )
{
std::wstring ProviderId(m_oBufferedStream.GetString3(length));
pComment->ProviderId = ProviderId;
}
else if ( c_oSer_CommentsType::Date == type )
{
std::wstring Date(m_oBufferedStream.GetString3(length));
@ -3389,6 +3413,11 @@ int Binary_CommentsTableReader::ReadCommentContent(BYTE type, long length, void*
pComment->bSolved = true;
pComment->Solved = m_oBufferedStream.GetBool();
}
else if ( c_oSer_CommentsType::DurableId == type )
{
pComment->bDurableId = true;
pComment->DurableId = m_oBufferedStream.GetULong();
}
else if ( c_oSer_CommentsType::Replies == type )
{
READ1_DEF(length, res, this->ReadReplies, &pComment->replies);
@ -3518,6 +3547,50 @@ int Binary_SettingsTableReader::ReadSettings(BYTE type, long length, void* poRes
std::wstring sListSeparator = m_oBufferedStream.GetString3(length);
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:listSeparator w:val=\"" + XmlUtils::EncodeXmlString(sListSeparator) + L"\"/>");
}
else if( c_oSer_SettingsType::GutterAtTop == type )
{
bool bGutterAtTop = m_oBufferedStream.GetBool();
if (bGutterAtTop)
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:gutterAtTop/>");
else
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:gutterAtTop w:val=\"0\"/>");
}
else if( c_oSer_SettingsType::MirrorMargins == type )
{
bool bMirrorMargins = m_oBufferedStream.GetBool();
if (bMirrorMargins)
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:mirrorMargins/>");
else
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:mirrorMargins w:val=\"0\"/>");
}
else if( c_oSer_SettingsType::PrintTwoOnOne == type )
{
bool bPrintTwoOnOne = m_oBufferedStream.GetBool();
if (bPrintTwoOnOne)
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:printTwoOnOne/>");
else
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:printTwoOnOne w:val=\"0\"/>");
}
else if( c_oSer_SettingsType::BookFoldPrinting == type )
{
bool bBookFoldPrinting = m_oBufferedStream.GetBool();
if (bBookFoldPrinting)
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:bookFoldPrinting/>");
else
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:bookFoldPrinting w:val=\"0\"/>");
}
else if( c_oSer_SettingsType::BookFoldPrintingSheets == type )
{
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:bookFoldPrintingSheets w:val=\"" + std::to_wstring(m_oBufferedStream.GetLong()) + L"\"/>");
}
else if( c_oSer_SettingsType::BookFoldRevPrinting == type )
{
bool bBookFoldRevPrinting = m_oBufferedStream.GetBool();
if (bBookFoldRevPrinting)
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:bookFoldRevPrinting/>");
else
m_oFileWriter.m_oSettingWriter.AddSetting(L"<w:bookFoldRevPrinting w:val=\"0\"/>");
}
else if( c_oSer_SettingsType::SdtGlobalColor == type )
{
rPr oRPr(m_oFileWriter.m_oFontTableWriter.m_mapFonts);
@ -3530,10 +3603,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);
@ -4182,15 +4372,15 @@ int Binary_DocumentTableReader::ReadParagraphContent(BYTE type, long length, voi
}
else if ( c_oSerParType::OMathPara == type )
{
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("<m:oMathPara>")));
GetRunStringWriter().WriteString(std::wstring(_T("<m:oMathPara>")));
READ1_DEF(length, res, this->ReadMathOMathPara, poResult);
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("</m:oMathPara>")));
GetRunStringWriter().WriteString(std::wstring(_T("</m:oMathPara>")));
}
else if ( c_oSerParType::OMath == type )
{
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("<m:oMath>")));
GetRunStringWriter().WriteString(std::wstring(_T("<m:oMath>")));
READ1_DEF(length, res, this->ReadMathArg, poResult);
m_oDocumentWriter.m_oContent.WriteString(std::wstring(_T("</m:oMath>")));
GetRunStringWriter().WriteString(std::wstring(_T("</m:oMath>")));
}
else if ( c_oSerParType::MRun == type )
{
@ -9052,13 +9242,15 @@ int BinaryFileReader::ReadMainTable()
std::wstring sContent = oComments.writeContent();
std::wstring sContentEx = oComments.writeContentExt(); //важно чтобы writeContentExt вызывался после writeContent
std::wstring sContentsId = oComments.writeContentsIds();
std::wstring sPeople = oComments.writePeople();
std::wstring sDocumentContent = oBinary_DocumentCommentsTableReader.m_oComments.writeContent();
std::wstring sDocumentContentEx = oBinary_DocumentCommentsTableReader.m_oComments.writeContentExt(); //важно чтобы writeContentExt вызывался после writeContent
std::wstring sDocumentContentsId = oBinary_DocumentCommentsTableReader.m_oComments.writeContentsIds();
std::wstring sDocumentPeople = oBinary_DocumentCommentsTableReader.m_oComments.writePeople();
oCommentsWriter.setElements(sContent, sContentEx, sPeople, sDocumentContent, sDocumentContentEx, sDocumentPeople);
oCommentsWriter.setElements(sContent, sContentEx, sContentsId, sPeople, sDocumentContent, sDocumentContentEx, sDocumentContentsId, sDocumentPeople);
if(false == oCommentsWriter.m_sComment.empty())
{
@ -9072,6 +9264,12 @@ int BinaryFileReader::ReadMainTable()
m_oFileWriter.m_pDrawingConverter->WriteRels(OOX::FileTypes::CommentsExt.RelationType(), OOX::FileTypes::CommentsExt.DefaultFileName().GetPath(), std::wstring(), &rId);
m_oFileWriter.m_pDrawingConverter->Registration(OOX::FileTypes::CommentsExt.OverrideType(), L"/word", OOX::FileTypes::CommentsExt.DefaultFileName().GetPath());
}
if(false == oCommentsWriter.m_sCommentsIds.empty())
{
unsigned int rId;
m_oFileWriter.m_pDrawingConverter->WriteRels(OOX::FileTypes::CommentsIds.RelationType(), OOX::FileTypes::CommentsIds.DefaultFileName().GetPath(), std::wstring(), &rId);
m_oFileWriter.m_pDrawingConverter->Registration(OOX::FileTypes::CommentsIds.OverrideType(), L"/word", OOX::FileTypes::CommentsIds.DefaultFileName().GetPath());
}
if(false == oCommentsWriter.m_sPeople.empty())
{
unsigned int rId;
@ -9090,6 +9288,12 @@ int BinaryFileReader::ReadMainTable()
m_oFileWriter.m_pDrawingConverter->WriteRels(OOX::FileTypes::DocumentCommentsExt.RelationType(), OOX::FileTypes::DocumentCommentsExt.DefaultFileName().GetPath(), std::wstring(), &rId);
m_oFileWriter.m_pDrawingConverter->Registration(OOX::FileTypes::DocumentCommentsExt.OverrideType(), L"/word", OOX::FileTypes::DocumentCommentsExt.DefaultFileName().GetPath());
}
if(false == oCommentsWriter.m_sDocumentCommentsIds.empty())
{
unsigned int rId;
m_oFileWriter.m_pDrawingConverter->WriteRels(OOX::FileTypes::DocumentCommentsIds.RelationType(), OOX::FileTypes::DocumentCommentsIds.DefaultFileName().GetPath(), std::wstring(), &rId);
m_oFileWriter.m_pDrawingConverter->Registration(OOX::FileTypes::DocumentCommentsIds.OverrideType(), L"/word", OOX::FileTypes::DocumentCommentsIds.DefaultFileName().GetPath());
}
if(false == oCommentsWriter.m_sDocumentPeople.empty())
{
unsigned int rId;

View File

@ -247,6 +247,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);

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

@ -467,7 +467,8 @@ extern int g_nCurFormatVersion;
cols = 8,
pgBorders = 9,
footnotePr = 10,
endnotePr = 11
endnotePr = 11,
rtlGutter = 12
};}
namespace c_oSerProp_secPrSettingsType{enum c_oSerProp_secPrSettingsType
{
@ -506,7 +507,8 @@ extern int g_nCurFormatVersion;
JsaProject = 22,
BookmarkStart = 23,
BookmarkEnd = 24,
MRun = 25
MRun = 25,
AltChunk = 26
};}
namespace c_oSerDocTableType{enum c_oSerDocTableType
{
@ -782,7 +784,8 @@ extern int g_nCurFormatVersion;
RightTwips = 8,
BottomTwips = 9,
HeaderTwips = 10,
FooterTwips = 11
FooterTwips = 11,
GutterTwips = 12
};}
namespace c_oSer_ColorType{enum c_oSer_ColorType
{
@ -801,7 +804,9 @@ extern int g_nCurFormatVersion;
QuoteText = 7,
Solved = 8,
Replies = 9,
OOData = 10
OOData = 10,
DurableId = 11,
ProviderId = 12
};}
namespace c_oSer_SettingsType{enum c_oSer_SettingsType
{
@ -816,7 +821,13 @@ extern int g_nCurFormatVersion;
Compat = 8,
DefaultTabStopTwips = 9,
DecimalSymbol = 10,
ListSeparator = 11
ListSeparator = 11,
GutterAtTop = 12,
MirrorMargins = 13,
PrintTwoOnOne = 14,
BookFoldPrinting = 15,
BookFoldPrintingSheets = 16,
BookFoldRevPrinting = 17
};}
namespace c_oSer_MathPrType{enum c_oSer_SettingsType
{
@ -1212,7 +1223,10 @@ extern int g_nCurFormatVersion;
CompatSetting = 0,
CompatName = 1,
CompatUri = 2,
CompatValue = 3
CompatValue = 3,
Flags1 = 4,
Flags2 = 5,
Flags3 = 6
};}
}

View File

@ -33,6 +33,8 @@
#include "../DocWrapper/FontProcessor.h"
#include "../../Common/Base64.h"
#include "../../Common/OfficeFileFormatChecker.h"
#include "../../ASCOfficePPTXFile/Editor/FontCutter.h"
#include "../../ASCOfficePPTXFile/PPTXFormat/App.h"
#include "../../ASCOfficePPTXFile/PPTXFormat/Core.h"
@ -40,6 +42,16 @@
#include "BinEquationWriter.h"
#include "../../OfficeUtils/src/OfficeUtils.h"
#ifndef _IOS
#include "../../ASCOfficeDocFile/DocFormatLib/DocFormatLib.h"
#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
{
@ -801,7 +813,7 @@ void Binary_rPrWriter::Write_rPrChange(const OOX::Logic::CRPrChange& rPrChange)
if(rPrChange.m_pRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::rPrChange);
Write_rPr(rPrChange.m_pRunPr.operator->());
Write_rPr(rPrChange.m_pRunPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
@ -944,7 +956,7 @@ void Binary_pPrWriter::Write_pPr(const OOX::Logic::CParagraphProperty& pPr)
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::pPr_rPr);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable);
nCurPos = m_oBcw.WriteItemWithLengthStart();
brPrs.Write_rPr(pPr.m_oRPr.operator->());
brPrs.Write_rPr(pPr.m_oRPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
//FramePr
@ -1313,6 +1325,12 @@ void Binary_pPrWriter::WriteSectPr (OOX::Logic::CSectionProperty* pSectPr)
NULL, &pSectPr->m_oEndnotePr->m_oPos, NULL);
m_oBcw.WriteItemEnd(nCurPos);
}
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());
}
}
void Binary_pPrWriter::WritePageSettings(OOX::Logic::CSectionProperty* pSectPr)
{
@ -1411,6 +1429,12 @@ void Binary_pPrWriter::WritePageMargin(OOX::Logic::CSectionProperty* pSectPr)
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pMar.m_oFooter->ToTwips());
}
if(pMar.m_oGutter.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_pgMarType::GutterTwips);
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Long);
m_oBcw.m_oStream.WriteLONG(pMar.m_oGutter->ToTwips());
}
}
}
void Binary_pPrWriter::WriteHeaderFooter(OOX::Logic::CSectionProperty* pSectPr, std::vector<ComplexTypes::Word::CHdrFtrRef*>& aRefs, bool bHdr)
@ -1425,7 +1449,7 @@ void Binary_pPrWriter::WriteHeaderFooter(OOX::Logic::CSectionProperty* pSectPr,
if (oFile.IsInit() && (OOX::FileTypes::Header == oFile->type() || OOX::FileTypes::Footer == oFile->type()))
{
int nIndex = 0;
OOX::CHdrFtr* pHdrFtr = (OOX::CHdrFtr*)oFile.operator->();
OOX::CHdrFtr* pHdrFtr = (OOX::CHdrFtr*)oFile.GetPointer();
if(bHdr)
{
nIndex = (int)m_oBinaryHeaderFooterTableWriter->m_aHeaders.size();
@ -2264,7 +2288,7 @@ void Binary_tblPrWriter::WriteTcPrChange(const OOX::Logic::CTcPrChange& tcPrChan
if(tcPrChange.m_pTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_RevisionType::tcPrChange);
WriteCellPr(tcPrChange.m_pTcPr.operator->());
WriteCellPr(tcPrChange.m_pTcPr.GetPointer());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
}
@ -2452,7 +2476,7 @@ void BinaryStyleTableWriter::WriteStyle(const OOX::CStyle& style)
if(false != style.m_oRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_TextPr);
brPrs.Write_rPr(style.m_oRunPr.operator->());
brPrs.Write_rPr(style.m_oRunPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
//ParaPr
@ -2480,7 +2504,7 @@ void BinaryStyleTableWriter::WriteStyle(const OOX::CStyle& style)
if(false != style.m_oTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_sts::Style_CellPr);
btblPrs.WriteCellPr(style.m_oTcPr.operator->());
btblPrs.WriteCellPr(style.m_oTcPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
//TblStylePr
@ -2557,7 +2581,7 @@ void BinaryStyleTableWriter::WriteTblStyleProperties(const OOX::Logic::CTableSty
if(false != oProperty.m_oRunPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::RunPr);
brPrs.Write_rPr(oProperty.m_oRunPr.operator->());
brPrs.Write_rPr(oProperty.m_oRunPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
//ParaPr
@ -2585,7 +2609,7 @@ void BinaryStyleTableWriter::WriteTblStyleProperties(const OOX::Logic::CTableSty
if(false != oProperty.m_oTcPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerProp_tblStylePrType::TcPr);
btblPrs.WriteCellPr(oProperty.m_oTcPr.operator->());
btblPrs.WriteCellPr(oProperty.m_oTcPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
}
@ -2757,15 +2781,16 @@ void BinaryNumberingTableWriter::WriteLevel(const OOX::Numbering::CLvl& lvl)
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(numbering_numfmt_Decimal);break;
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
}
}
}
@ -3028,10 +3053,25 @@ void BinaryDocumentTableWriter::WriteDocumentContent(const std::vector<OOX::Writ
switch(item->getType())
{
case OOX::et_w_altChunk:
{
OOX::Logic::CAltChunk* pAltChunk = static_cast<OOX::Logic::CAltChunk*>(item);
if (pAltChunk->m_oId.IsInit())
{
OOX::Rels::CRelationShip* oRels = NULL;
smart_ptr<OOX::File> pFile = m_oParamsDocumentWriter.m_pRels->Find( OOX::RId(pAltChunk->m_oId.get().GetValue()));
if (pFile.IsInit() && OOX::FileTypes::Media == pFile->type())
{
OOX::Media* pAltChunkFile = static_cast<OOX::Media*>(pFile.operator ->());
WriteAltChunk(*pAltChunkFile);
}
}
}break;
case OOX::et_w_p:
{
OOX::Logic::CParagraph* pParagraph = static_cast<OOX::Logic::CParagraph*>(item);
OOX::Logic::CParagraphProperty* pPr = pParagraph->m_oParagraphProperty;
OOX::Logic::CParagraph* pParagraph = static_cast<OOX::Logic::CParagraph*>(item);
OOX::Logic::CParagraphProperty* pPr = pParagraph->m_oParagraphProperty;
m_oBcw.m_oStream.WriteBYTE(c_oSerParType::Par);
nCurPos = m_oBcw.WriteItemWithLengthStart();
@ -3178,6 +3218,68 @@ void BinaryDocumentTableWriter::WriteBackground (OOX::Logic::CBackground* pBackg
m_oBcw.WriteItemEnd(nCurPos);
}
}
void BinaryDocumentTableWriter::WriteAltChunk(OOX::Media& oAltChunkFile)
{
if (false == oAltChunkFile.IsExist()) return;
std::wstring file_name_inp = oAltChunkFile.filename().GetPath();
std::wstring sTempDir = NSDirectory::CreateDirectoryWithUniqueName(oAltChunkFile.filename().GetDirectory());
std::wstring sResultDocxDir = NSDirectory::CreateDirectoryWithUniqueName(oAltChunkFile.filename().GetDirectory());
bool result = false;
COfficeFileFormatChecker OfficeFileFormatChecker;
if (OfficeFileFormatChecker.isOfficeFile(file_name_inp))
{
switch(OfficeFileFormatChecker.nFileType)
{
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX:
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM:
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX:
case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM:
{
COfficeUtils oCOfficeUtils(NULL);
result = (S_OK == oCOfficeUtils.ExtractToDirectory(file_name_inp, sResultDocxDir, NULL, 0));
}break;
}
}
NSDirectory::DeleteDirectory(sTempDir);
if (result)
{
OOX::CDocx oDocx = OOX::CDocx(OOX::CPath(sResultDocxDir));
if (oDocx.m_pDocument)
{
ParamsDocumentWriter oParamsDocumentWriterEmb(oDocx.m_pDocument);
ParamsWriter oParamsWriterEmb( m_oParamsWriter.m_pCBufferedStream,
m_oParamsWriter.m_pFontProcessor,
m_oParamsWriter.m_pOfficeDrawingConverter,
m_oParamsWriter.m_pEmbeddedFontsManager);
oParamsWriterEmb.m_poTheme = oDocx.m_pTheme;
oParamsWriterEmb.m_oSettings = oDocx.m_pSettings;
oParamsWriterEmb.m_pCurRels = oParamsDocumentWriterEmb.m_pRels;
BinaryDocumentTableWriter oBinaryDocumentEmbTableWriter(oParamsWriterEmb, oParamsDocumentWriterEmb, &oParamsWriterEmb.m_mapIgnoreComments, NULL);
//*oBufferedStream.m_pTheme = smart_ptr<PPTX::Theme>(oDocx.m_pTheme);
//oBufferedStream.m_pTheme->AddRef();
//if(NULL != oDocx.m_pFontTable)
// m_oParamsWriter.m_pFontProcessor->setFontTable(oDocx.m_pFontTable);
oBinaryDocumentEmbTableWriter.WriteDocumentContent(oDocx.m_pDocument->m_arrItems);
}
}
NSDirectory::DeleteDirectory(sResultDocxDir);
}
void BinaryDocumentTableWriter::WriteParapraph(OOX::Logic::CParagraph& par, OOX::Logic::CParagraphProperty* pPr)
{
int nCurPos = 0;
@ -4293,7 +4395,7 @@ void BinaryDocumentTableWriter::WriteMathRunContent(OOX::Logic::CMRun* pMRun)
if ( pMRun->m_oRPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::RPr);
brPrs.Write_rPr(pMRun->m_oRPr.operator->());
brPrs.Write_rPr(pMRun->m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pMRun->m_oARPr.IsInit() )
@ -4542,7 +4644,7 @@ void BinaryDocumentTableWriter::WriteMathCtrlPr(const OOX::Logic::CCtrlPr &pCtrl
if ( pCtrlPr.m_oRPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::rPr);
brPrs.Write_rPr(pCtrlPr.m_oRPr.operator->());
brPrs.Write_rPr(pCtrlPr.m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pCtrlPr.m_oARPr.IsInit() )
@ -7028,7 +7130,7 @@ void BinaryDocumentTableWriter::WriteSdt(OOX::Logic::CSdt* pStd, int type, OOX::
if(pStd->m_oSdtEndPr.IsInit() && pStd->m_oSdtEndPr->m_oRPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::EndPr);
brPrs.Write_rPr(pStd->m_oSdtEndPr->m_oRPr.operator->());
brPrs.Write_rPr(pStd->m_oSdtEndPr->m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
if(pStd->m_oSdtContent.IsInit())
@ -7152,7 +7254,7 @@ void BinaryDocumentTableWriter::WriteSdtPr(const OOX::Logic::CSdtPr& oStdPr)
if(oStdPr.m_oRPr.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::RPr);
brPrs.Write_rPr(oStdPr.m_oRPr.operator->());
brPrs.Write_rPr(oStdPr.m_oRPr.GetPointer());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oStdPr.m_oShowingPlcHdr.IsInit())
@ -7317,17 +7419,16 @@ void BinaryDocumentTableWriter::WriteDropDownList(const OOX::Logic::CSdtDropDown
BinaryCommentsTableWriter::BinaryCommentsTableWriter(ParamsWriter& oParamsWriter):m_oBcw(oParamsWriter)
{
};
void BinaryCommentsTableWriter::Write(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, std::map<int, bool>& mapIgnoreComments)
void BinaryCommentsTableWriter::Write(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, OOX::CCommentsIds* pCommentsIds, std::map<int, bool>& mapIgnoreComments)
{
int nStart = m_oBcw.WriteItemWithLengthStart();
WriteCommentsContent(oComments, pCommentsExt, pPeople, mapIgnoreComments);
WriteCommentsContent(oComments, pCommentsExt, pPeople, pCommentsIds, mapIgnoreComments);
m_oBcw.WriteItemWithLengthEnd(nStart);
}
void BinaryCommentsTableWriter::WriteCommentsContent(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, std::map<int, bool>& mapIgnoreComments)
void BinaryCommentsTableWriter::WriteCommentsContent(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, OOX::CCommentsIds* pCommentsIds, std::map<int, bool>& mapIgnoreComments)
{
std::map<std::wstring, std::wstring> mapAuthorToUserId;
std::map<int, CCommentWriteTemp*> mapParaIdToComment;
std::map<int, bool> mapCommentsIgnore;
std::map<std::wstring, OOX::CPerson*> mapAuthorToUserId;
std::map<unsigned int, CCommentWriteTemp*> mapParaIdToComment;
std::vector<CCommentWriteTemp*> aCommentsToWrite;
//map author -> userId
if(NULL != pPeople)
@ -7335,8 +7436,8 @@ void BinaryCommentsTableWriter::WriteCommentsContent(OOX::CComments& oComments,
for(size_t i = 0, length = pPeople->m_arrPeoples.size(); i < length; i++)
{
OOX::CPerson* pPerson = pPeople->m_arrPeoples[i];
if(NULL != pPerson && pPerson->m_oAuthor.IsInit() && pPerson->m_oPresenceInfo.IsInit() && pPerson->m_oPresenceInfo->m_oProviderId.IsInit() && _T("Teamlab") == pPerson->m_oPresenceInfo->m_oProviderId.get2() && pPerson->m_oPresenceInfo->m_oUserId.IsInit())
mapAuthorToUserId[pPerson->m_oAuthor.get2()] = pPerson->m_oPresenceInfo->m_oUserId.get2();
if(NULL != pPerson && pPerson->m_oAuthor.IsInit())
mapAuthorToUserId[pPerson->m_oAuthor.get2()] = pPerson;
}
}
//map paraId -> CCommentWriteTemp
@ -7347,9 +7448,22 @@ void BinaryCommentsTableWriter::WriteCommentsContent(OOX::CComments& oComments,
pNewCommentWriteTemp->pComment = pComment;
if(pComment->m_oAuthor.IsInit())
{
std::map<std::wstring, std::wstring>::const_iterator pPair = mapAuthorToUserId.find(pComment->m_oAuthor.get2());
std::map<std::wstring, OOX::CPerson*>::const_iterator pPair = mapAuthorToUserId.find(pComment->m_oAuthor.get2());
if(mapAuthorToUserId.end() != pPair)
pNewCommentWriteTemp->sUserId = pPair->second;
{
OOX::CPerson* pPerson = pPair->second;
if(pPerson->m_oPresenceInfo.IsInit())
{
if(pPerson->m_oPresenceInfo->m_oUserId.IsInit())
{
pNewCommentWriteTemp->sUserId = pPerson->m_oPresenceInfo->m_oUserId.get();
}
if(pPerson->m_oPresenceInfo->m_oProviderId.IsInit())
{
pNewCommentWriteTemp->sProviderId = pPerson->m_oPresenceInfo->m_oProviderId.get();
}
}
}
}
for(std::vector<OOX::WritingElement*>::iterator jt = pComment->m_arrItems.begin(); jt != pComment->m_arrItems.end(); jt++)
{
@ -7372,7 +7486,7 @@ void BinaryCommentsTableWriter::WriteCommentsContent(OOX::CComments& oComments,
OOX::CCommentExt* pCommentExt = pCommentsExt->m_arrComments[i];
if(pCommentExt->m_oParaId.IsInit())
{
std::map<int, CCommentWriteTemp*>::const_iterator pPair = mapParaIdToComment.find(pCommentExt->m_oParaId->GetValue());
std::map<unsigned int, CCommentWriteTemp*>::const_iterator pPair = mapParaIdToComment.find(pCommentExt->m_oParaId->GetValue());
if(mapParaIdToComment.end() != pPair)
{
CCommentWriteTemp* pCommentWriteTemp = pPair->second;
@ -7381,8 +7495,8 @@ void BinaryCommentsTableWriter::WriteCommentsContent(OOX::CComments& oComments,
pCommentWriteTemp->bDone = pCommentExt->m_oDone->ToBool();
if(pCommentExt->m_oParaIdParent.IsInit())
{
int nParaIdParent = pCommentExt->m_oParaIdParent->GetValue();
std::map<int, CCommentWriteTemp*>::const_iterator pPairParent = mapParaIdToComment.find(nParaIdParent);
unsigned int nParaIdParent = pCommentExt->m_oParaIdParent->GetValue();
std::map<unsigned int, CCommentWriteTemp*>::const_iterator pPairParent = mapParaIdToComment.find(nParaIdParent);
if(mapParaIdToComment.end() != pPairParent)
{
CCommentWriteTemp* pCommentWriteTempParent = pPairParent->second;
@ -7395,7 +7509,22 @@ void BinaryCommentsTableWriter::WriteCommentsContent(OOX::CComments& oComments,
}
}
}
int nCurPos = 0;
if(NULL != pCommentsIds)
{
for(size_t i = 0, length = pCommentsIds->m_arrComments.size(); i < length; i++)
{
OOX::CCommentId* pCommentId = pCommentsIds->m_arrComments[i];
if(pCommentId->m_oParaId.IsInit() && pCommentId->m_oDurableId.IsInit())
{
std::map<unsigned int, CCommentWriteTemp*>::const_iterator pPair = mapParaIdToComment.find(pCommentId->m_oParaId->GetValue());
if(mapParaIdToComment.end() != pPair)
{
CCommentWriteTemp* pCommentWriteTemp = pPair->second;
pCommentWriteTemp->nDurableId = pCommentId->m_oDurableId;
}
}
}
}
for(size_t i = 0, length = aCommentsToWrite.size(); i < length; ++i)
{
@ -7451,12 +7580,30 @@ void BinaryCommentsTableWriter::WriteComment(CCommentWriteTemp& oComment)
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentsType::UserId);
m_oBcw.m_oStream.WriteStringW(oComment.sUserId.get2());
}
if(oComment.sProviderId.IsInit())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentsType::ProviderId);
m_oBcw.m_oStream.WriteStringW(oComment.sProviderId.get2());
}
if(oComment.bDone.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentsType::Solved);
m_oBcw.m_oStream.WriteBOOL(oComment.bDone.get2());
m_oBcw.WriteItemEnd(nCurPos);
}
_UINT32 nDurableId;
if(oComment.nDurableId.IsInit())
{
nDurableId = oComment.nDurableId->GetValue();
}
else
{
nDurableId = XmlUtils::GenerateInt();
}
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentsType::DurableId);
m_oBcw.m_oStream.WriteULONG(nDurableId);
m_oBcw.WriteItemEnd(nCurPos);
if(oComment.aReplies.size() > 0)
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentsType::Replies);
@ -7545,6 +7692,42 @@ void BinarySettingsTableWriter::WriteSettingsContent(OOX::CSettings& oSettings,
m_oBcw.m_oStream.WriteStringW3(oSettings.m_oListSeparator->m_sVal.get());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oGutterAtTop.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::GutterAtTop);
m_oBcw.m_oStream.WriteBOOL(oSettings.m_oGutterAtTop->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oMirrorMargins.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::MirrorMargins);
m_oBcw.m_oStream.WriteBOOL(oSettings.m_oMirrorMargins->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oPrintTwoOnOne.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::PrintTwoOnOne);
m_oBcw.m_oStream.WriteBOOL(oSettings.m_oPrintTwoOnOne->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oBookFoldPrinting.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::BookFoldPrinting);
m_oBcw.m_oStream.WriteBOOL(oSettings.m_oBookFoldPrinting->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oBookFoldPrintingSheets.IsInit() && oSettings.m_oBookFoldPrintingSheets->m_oVal.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::BookFoldPrintingSheets);
m_oBcw.m_oStream.WriteLONG(oSettings.m_oBookFoldPrintingSheets->m_oVal->GetValue());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettings.m_oBookFoldRevPrinting.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::BookFoldRevPrinting);
m_oBcw.m_oStream.WriteBOOL(oSettings.m_oBookFoldRevPrinting->m_oVal.ToBool());
m_oBcw.WriteItemEnd(nCurPos);
}
if(oSettingsCustom.m_oSdtGlobalColor.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::SdtGlobalColor);
@ -7877,6 +8060,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);
@ -8074,14 +8336,14 @@ void BinaryFileWriter::intoBindoc(const std::wstring& sDir)
{
BinDocxRW::BinaryCommentsTableWriter oBinaryCommentsTableWriter(m_oParamsWriter);
int nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Comments);
oBinaryCommentsTableWriter.Write(*oDocx.m_pComments, oDocx.m_pCommentsExt, oDocx.m_pPeople, m_oParamsWriter.m_mapIgnoreComments);
oBinaryCommentsTableWriter.Write(*oDocx.m_pComments, oDocx.m_pCommentsExt, oDocx.m_pPeople, oDocx.m_pCommentsIds, m_oParamsWriter.m_mapIgnoreComments);
this->WriteTableEnd(nCurPos);
}
if(NULL != oDocx.m_pDocumentComments)
{
BinDocxRW::BinaryCommentsTableWriter oBinaryCommentsTableWriter(m_oParamsWriter);
int nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::DocumentComments);
oBinaryCommentsTableWriter.Write(*oDocx.m_pDocumentComments, oDocx.m_pDocumentCommentsExt, oDocx.m_pDocumentPeople, m_oParamsWriter.m_mapIgnoreComments);
oBinaryCommentsTableWriter.Write(*oDocx.m_pDocumentComments, oDocx.m_pDocumentCommentsExt, oDocx.m_pDocumentPeople, oDocx.m_pDocumentCommentsIds, m_oParamsWriter.m_mapIgnoreComments);
this->WriteTableEnd(nCurPos);
}

View File

@ -310,6 +310,8 @@ namespace BinDocxRW
bool m_bWriteSectPr;//Записывать ли свойства верхнего уровня в данном экземпляре BinaryOtherTableWriter
//---------------------------------
BinaryDocumentTableWriter(ParamsWriter& oParamsWriter, ParamsDocumentWriter& oParamsDocumentWriter, std::map<int, bool>* mapIgnoreComments, BinaryHeaderFooterTableWriter* oBinaryHeaderFooterTableWriter);
void WriteAltChunk(OOX::Media& oAltChunk);
void WriteVbaProject(OOX::VbaProject& oVbaProject);
void Write(std::vector<OOX::WritingElement*> & aElems);
void WriteDocumentContent(const std::vector<OOX::WritingElement*> & aElems);
@ -481,13 +483,15 @@ namespace BinDocxRW
OOX::CComment* pComment;
nullable<bool> bDone;
nullable<std::wstring> sUserId;
nullable<std::wstring> sProviderId;
nullable<SimpleTypes::CLongHexNumber<> > nDurableId;
std::vector<CCommentWriteTemp*> aReplies;
};
BinaryCommonWriter m_oBcw;
public:
BinaryCommentsTableWriter(ParamsWriter& oParamsWriter);
void Write(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, std::map<int, bool>& mapIgnoreComments);
void WriteCommentsContent(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, std::map<int, bool>& mapIgnoreComments);
void Write(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, OOX::CCommentsIds* pCommentsIds, std::map<int, bool>& mapIgnoreComments);
void WriteCommentsContent(OOX::CComments& oComments, OOX::CCommentsExt* pCommentsExt, OOX::CPeople* pPeople, OOX::CCommentsIds* pCommentsIds, std::map<int, bool>& mapIgnoreComments);
void WriteComment(CCommentWriteTemp& oComment);
void WriteReplies(std::vector<CCommentWriteTemp*>& aCommentWriteTemp);
};

View File

@ -187,7 +187,7 @@ namespace BinXlsxRW{
{
OOX::Spreadsheet::CText* pText = new OOX::Spreadsheet::CText();
pText->m_sText = aSharedStrings[i];
if(std::wstring::npos == pText->m_sText.find(_T(" ")))
if(std::wstring::npos != pText->m_sText.find(_T(" ")))
{
pText->m_oSpace.Init();
pText->m_oSpace->SetValue(SimpleTypes::xmlspacePreserve);
@ -277,13 +277,20 @@ namespace BinXlsxRW{
pTable->m_oTable->m_oTableStyleInfo->m_oShowColumnStripes.Init();
pTable->m_oTable->m_oTableStyleInfo->m_oShowColumnStripes->FromBool(false);
pTable->m_oTable->m_oTableColumns.Init();
for(size_t i = 0; i < m_aTableNames.size(); ++i)
{
OOX::Spreadsheet::CTableColumn* pTableColumn = new OOX::Spreadsheet::CTableColumn();
pTableColumn->m_oId.Init();
pTableColumn->m_oId->SetValue((unsigned int)i + 1);
pTableColumn->m_oName.Init();
pTableColumn->m_oName->append(m_aTableNames[i]);
if (!pTableColumn->m_oId.IsInit())
{
pTableColumn->m_oId.Init();
pTableColumn->m_oId->SetValue((unsigned int)i + 1);
}
if (!pTableColumn->m_oName.IsInit())
{
pTableColumn->m_oName = m_aTableNames[i];
}
pTable->m_oTable->m_oTableColumns->m_arrItems.push_back(pTableColumn);
}
pTable->m_oTable->m_oTableColumns->m_oCount.Init();

View File

@ -342,6 +342,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
);
mainGroup = 17E17ED31AC453F800BEA2EA;
@ -384,7 +385,7 @@
17C1FEC01ACC42C4006B99B3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ENABLE_BITCODE = NO;
ENABLE_BITCODE = YES;
EXECUTABLE_PREFIX = lib;
GCC_ENABLE_CPP_EXCEPTIONS = YES;
GCC_ENABLE_CPP_RTTI = YES;
@ -416,7 +417,7 @@
17C1FEC11ACC42C4006B99B3 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ENABLE_BITCODE = NO;
ENABLE_BITCODE = YES;
EXECUTABLE_PREFIX = lib;
GCC_ENABLE_CPP_EXCEPTIONS = YES;
GCC_ENABLE_CPP_RTTI = YES;

View File

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

View File

@ -122,27 +122,64 @@ namespace formulasconvert {
XmlUtils::replace_all( expr, L"SCOBCAIN", L"(");
XmlUtils::replace_all( expr, L"SCOBCAOUT", L")");
XmlUtils::replace_all( expr, L"KVADRATIN", L"[");
XmlUtils::replace_all( expr, L"KVADRATOUT", L"]");
//XmlUtils::replace_all( expr, L"KVADRATIN", L"[");
//XmlUtils::replace_all( expr, L"KVADRATOUT", L"]");
XmlUtils::replace_all( expr, L"PROBEL", L" ");
XmlUtils::replace_all( expr, L"APOSTROF", L"'");
XmlUtils::replace_all( expr, L"KAVYCHKA", L"\"");
//XmlUtils::replace_all( expr, L"APOSTROF", L"'");
//XmlUtils::replace_all( expr, L"KAVYCHKA", L"\"");
}
static void replace_tmp(std::wstring &expr)
{
XmlUtils::replace_all( expr, L".", L"ТОСHKA");
XmlUtils::replace_all( expr, L"!", L"VOSKL");
// XmlUtils::replace_all( expr, L".", L"ТОСHKA");
// XmlUtils::replace_all( expr, L"!", L"VOSKL");
XmlUtils::replace_all( expr, L"(", L"SCOBCAIN");
XmlUtils::replace_all( expr, L")", L"SCOBCAOUT");
// XmlUtils::replace_all( expr, L"(", L"SCOBCAIN");
// XmlUtils::replace_all( expr, L")", L"SCOBCAOUT");
//XmlUtils::replace_all( expr, L"[", L"KVADRATIN");
//XmlUtils::replace_all( expr, L"]", L"KVADRATOUT");
XmlUtils::replace_all( expr, L" ", L"PROBEL");
// XmlUtils::replace_all( expr, L"'", L"APOSTROF");
// XmlUtils::replace_all( expr, L"\"", L"KAVYCHKA");
// //XmlUtils::replace_all( expr, L"[", L"KVADRATIN");
// //XmlUtils::replace_all( expr, L"]", L"KVADRATOUT");
//
// XmlUtils::replace_all( expr, L" ", L"PROBEL");
//// XmlUtils::replace_all( expr, L"'", L"APOSTROF");
//// XmlUtils::replace_all( expr, L"\"", L"KAVYCHKA");
std::wstring result;
size_t pos = 0, size = expr.length();
while(pos < size)
{
switch(expr[pos])
{
case '.':
{
result += L"ТОСHKA";
}break;
case '!':
{
result += L"VOSKL";
}break;
case '(':
{
result += L"SCOBCAIN";
}break;
case ')':
{
result += L"SCOBCAOUT";
}break;
case ' ':
{
result += L"PROBEL";
}break;
default:
{
result += expr[pos];
}break;
}
pos++;
}
expr = result;
}
static std::wstring convert_scobci(boost::wsmatch const & what)
{

View File

@ -133,34 +133,202 @@ public:
}
static void oox_replace_tmp_back(std::wstring &expr)
{
XmlUtils::replace_all( expr, L"ТОСHKA", L".");
XmlUtils::replace_all( expr, L"VOSKL", L"!");
std::wstring result;
XmlUtils::replace_all( expr, L"SCOBCAIN", L"(");
XmlUtils::replace_all( expr, L"SCOBCAOUT", L")");
size_t pos = 0, size = expr.length();
XmlUtils::replace_all( expr, L"KVADRATIN", L"[");
XmlUtils::replace_all( expr, L"KVADRATOUT", L"]");
XmlUtils::replace_all( expr, L"PROBEL", L" ");
XmlUtils::replace_all( expr, L"APOSTROF", L"'");
XmlUtils::replace_all( expr, L"KAVYCHKA", L"\"");
while(pos < size)
{
if (pos + 5 >= size)
{
result += expr[pos++];
continue;
}
switch(expr[pos])
{
case 'M':
{
if ((pos + 5 < size) && (expr.substr(pos, 5) == L"MINYS"))
{
result += L"-"; pos += 5;
}
else
{
result += expr[pos++];
}
}break;
case 'T':
{
if ((pos + 6 < size) && (expr.substr(pos, 6) == L"ТОСHKA"))
{
result += L"."; pos += 6;
}
else
{
result += expr[pos++];
}
}break;
case 'V':
{
if ((pos + 5 < size) && (expr.substr(pos, 5) == L"VOSKL"))
{
result += L"!"; pos += 5;
}
else
{
result += expr[pos++];
}
}break;
case 'S':
{
if ((pos + 8 < size) && (expr.substr(pos, 8) == L"SCOBCAIN"))
{
result += L"("; pos += 8;
}
else if ((pos + 9 < size) && (expr.substr(pos, 9) == L"SCOBCAOUT"))
{
result += L")"; pos += 9;
}
else
{
result += expr[pos++];
}
}break;
case 'K':
{
if ((pos + 9 < size) && (expr.substr(pos, 9) == L"KVADRATIN"))
{
result += L"["; pos += 9;
}
else if ((pos + 10 < size) && (expr.substr(pos, 10) == L"KVADRATOUT"))
{
result += L"]"; pos += 10;
}
else if ((pos + 8 < size) && (expr.substr(pos, 8) == L"KAVYCHKA"))
{
result += L"\""; pos += 8;
}
else
{
result += expr[pos++];
}
}break;
case 'P':
{
if ((pos + 6 < size) && (expr.substr(pos, 6) == L"PROBEL"))
{
result += L" "; pos += 6;
}
else
{
result += expr[pos++];
}
}break;
case 'A':
{
if ((pos + 8 < size) && (expr.substr(pos, 8) == L"APOSTROF"))
{
result += L"'"; pos += 8;
}
else
{
result += expr[pos++];
}
}break;
default:
{
result += expr[pos++];
}break;
}
}
expr = result;
//XmlUtils::replace_all( expr, L"MINYS", L"-");
//XmlUtils::replace_all( expr, L"ТОСHKA", L".");
//XmlUtils::replace_all( expr, L"VOSKL", L"!");
//XmlUtils::replace_all( expr, L"SCOBCAIN", L"(");
//XmlUtils::replace_all( expr, L"SCOBCAOUT", L")");
//XmlUtils::replace_all( expr, L"KVADRATIN", L"[");
//XmlUtils::replace_all( expr, L"KVADRATOUT", L"]");
//
//XmlUtils::replace_all( expr, L"PROBEL", L" ");
//XmlUtils::replace_all( expr, L"APOSTROF", L"'");
//XmlUtils::replace_all( expr, L"KAVYCHKA", L"\"");
}
static void oox_replace_tmp(std::wstring &expr)
{
XmlUtils::replace_all( expr, L".", L"ТОСHKA");
XmlUtils::replace_all( expr, L"!", L"VOSKL");
std::wstring result;
XmlUtils::replace_all( expr, L"(", L"SCOBCAIN");
XmlUtils::replace_all( expr, L")", L"SCOBCAOUT");
size_t pos = 0, size = expr.length();
XmlUtils::replace_all( expr, L"[", L"KVADRATIN");
XmlUtils::replace_all( expr, L"]", L"KVADRATOUT");
XmlUtils::replace_all( expr, L" ", L"PROBEL");
XmlUtils::replace_all( expr, L"'", L"APOSTROF");
XmlUtils::replace_all( expr, L"\"", L"KAVYCHKA");
while(pos < size)
{
switch(expr[pos])
{
case '-':
{
result += L"MINYS";
}break;
case '.':
{
result += L"ТОСHKA";
}break;
case '!':
{
result += L"VOSKL";
}break;
case '(':
{
result += L"SCOBCAIN";
}break;
case ')':
{
result += L"SCOBCAOUT";
}break;
case '[':
{
result += L"KVADRATIN";
}break;
case ']':
{
result += L"KVADRATOUT";
}break;
case ' ':
{
result += L"PROBEL";
}break;
case '\'':
{
result += L"APOSTROF";
}break;
case '\"':
{
result += L"KAVYCHKA";
}break;
default:
{
result += expr[pos];
}break;
}
pos++;
}
expr = result;
//XmlUtils::replace_all( expr, L"-", L"MINYS");
//XmlUtils::replace_all( expr, L".", L"ТОСHKA");
//XmlUtils::replace_all( expr, L"!", L"VOSKL");
//XmlUtils::replace_all( expr, L"(", L"SCOBCAIN");
//XmlUtils::replace_all( expr, L")", L"SCOBCAOUT");
//XmlUtils::replace_all( expr, L"[", L"KVADRATIN");
//XmlUtils::replace_all( expr, L"]", L"KVADRATOUT");
//
//XmlUtils::replace_all( expr, L" ", L"PROBEL");
//XmlUtils::replace_all( expr, L"'", L"APOSTROF");
//XmlUtils::replace_all( expr, L"\"", L"KAVYCHKA");
}
static bool is_forbidden1(const std::wstring & formula)
@ -174,6 +342,7 @@ public:
}
void replace_named_ref(std::wstring & expr);
void replace_named_formula(std::wstring & expr);
bool is_simple_ref(std::wstring const & expr);
static bool isFindBaseCell_;
@ -195,7 +364,7 @@ void oox2odf_converter::Impl::replace_cells_range(std::wstring& expr, bool bSele
if (b)
{
boost::wregex re1(L"(\\$?[^\']+\\!)?([\\w^0-9$]*\\d*)\\:?([\\w^0-9$]*\\d*)?");
boost::wregex re1(L"(\\$?[^\\']+\\!)?([a-zA-Z$]+\\d*)(\\:[a-zA-Z$]+\\d*)?");
// $ Sheet2 ! $ A1 : $ B5
// $ Sheet2 ! $ A : $ A
// $ Sheet2 ! $ 1 : $ 1
@ -238,9 +407,11 @@ std::wstring oox2odf_converter::Impl::replace_cells_range_formater1(boost::wsmat
if (isFindBaseCell_ && table_name_.empty() && !sheet.empty())
{
table_name_ = sheet + L".$A$1";
table_name_ = L"$" + sheet + L".$A$1";
}
if (!sheet.empty() && (std::wstring::npos != c1.find(L"$"))) sheet = L"$" + sheet;
if (!c2.empty() && c2.substr(0, 1) == L":")
c2 = c2.substr(1);
s = L"[" + sheet + L"." + c1 + (c2.empty() ? L"" : (L":" + sheet + L"." + c2)) + std::wstring(L"]");
@ -281,10 +452,12 @@ std::wstring oox2odf_converter::Impl::replace_cells_range_formater2(boost::wsmat
if (isFindBaseCell_ && table_name_.empty() && !sheet.empty())
{
table_name_ = sheet + L".$A$1";
table_name_ = L"$" + sheet + L".$A$1";
}
if (!sheet.empty() && (std::wstring::npos != c1.find(L"$"))) sheet = L"$" + sheet;
if (!c2.empty() && c2.substr(0, 1) == L":")
c2 = c2.substr(1);
s = sheet + L"." + c1 + (c2.empty() ? L"" : (L":" + sheet + L"." + c2)) + std::wstring(L"");
}
@ -310,6 +483,19 @@ void oox2odf_converter::Impl::replace_named_formula(std::wstring & expr)
expr = convert_formula(expr);
isFindBaseCell_ = false;
}
bool oox2odf_converter::Impl::is_simple_ref(std::wstring const & expr)
{
if (expr.find(L"(") != std::wstring::npos) return false;
if (expr.find(L" ") != std::wstring::npos) return false;
if (expr.find(L";") != std::wstring::npos) return false;
boost::wsmatch match;
if (boost::regex_search(expr, match, boost::wregex(L"([\\w]+\\!)?\\$?[a-zA-Z]+\\$?\\d+(\\:\\$?[a-zA-Z]+\\$?\\d+)?")))
{
return true;
}
return false;
}
void oox2odf_converter::Impl::replace_named_ref(std::wstring & expr)
{
@ -644,6 +830,11 @@ std::wstring oox2odf_converter::convert_named_formula(const std::wstring& expr)
impl_->replace_named_formula(workstr);
return workstr;
}
bool oox2odf_converter::is_simple_ref(std::wstring const & expr)
{
return impl_->is_simple_ref(expr);
}
std::wstring oox2odf_converter::get_table_name()
{
return impl_->table_name_;

View File

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

View File

@ -39,7 +39,8 @@ enum ElementType
typeNone = 0,
type_AbstractXml,
typeTextText = 1000,
typeTextTextElement = 1000,
typeTextText,
typeTextS,
typeTextTab,
typeTextLineBreak,
@ -247,6 +248,7 @@ enum ElementType
typeStyleTableColumnProperties,
typeStyleTableRowProperties,
typeStyleTableCellProperties,
typeStyleHeaderFooter,
typeStyleHeader,
typeStyleFooter,
typeStyleHeaderFirst,
@ -468,6 +470,7 @@ enum ElementType
typeDrawHandle,
typeDrawEquation,
typeDrawEnhancedGeometry,
typeDrawGluePoint,
typeDr3dScene,
typeDr3dLight,
@ -506,6 +509,7 @@ enum ElementType
typeFormTime,
typeFormValueRange,
typeFormItem,
typeFormOption,
typeDrawPage,
typePresentationFooterDecl,
@ -533,7 +537,10 @@ enum ElementType
typeOfficeAnnotation,
typeOfficeAnnotationStart,
typeOfficeAnnotationEnd,
typeStyleRegion,
typeStyleRegionLeft,
typeStyleRegionCenter,
typeStyleRegionRight,
typeOfficeScripts,
typeOfficeScript,
typeOfficePresentation,
@ -589,8 +596,6 @@ enum ElementType
typeChartRegressionCurve,
typeChartEquation,
typeStyleRegionCenter,
typeStyleRegionRight,
typeStyleChartProperties,
typeCalcextColorScaleEntry,

View File

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

View File

@ -47,6 +47,7 @@
#include "../odf/style_graphic_properties.h"
#include "docx_package.h"
#include "xlsx_package.h"
#include "oox_rels.h"
#include "logging.h"
@ -130,7 +131,7 @@ text_tracked_context::_state & text_tracked_context::get_tracked_change(std::wst
}
//----------------------------------------------------------------------------------------------------------------
docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfDocument) :
docx_conversion_context::docx_conversion_context(odf_reader::odf_document * _odf_document) :
last_dump_page_properties_ (true),
next_dump_page_properties_ (false),
page_break_ (false),
@ -151,12 +152,14 @@ docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfD
is_delete_text_ (false),
delayed_converting_ (false),
process_headers_footers_ (false),
current_process_comment_ (false),
mediaitems_ (OdfDocument->get_folder() ),
math_context_ (OdfDocument->odf_context().fontContainer(), false),
odf_document_ (OdfDocument)
current_process_comment_ (false),
odf_document_ (_odf_document),
math_context_ (_odf_document->odf_context().fontContainer(), false)
{
streams_man_ = streams_man::create(temp_stream_);
mediaitems_ = boost::make_shared<mediaitems>(odf_document_->get_folder());
chart_drawing_handle_ = boost::make_shared<xlsx_drawing_context_handle>(mediaitems_);
streams_man_ = streams_man::create(temp_stream_);
}
docx_conversion_context::~docx_conversion_context()
{
@ -167,7 +170,7 @@ void docx_conversion_context::set_output_document(package::docx_document * docum
}
void docx_conversion_context::set_font_directory(std::wstring pathFonts)
{
mediaitems_.set_font_directory(pathFonts);
mediaitems_->set_font_directory(pathFonts);
}
std::wstring styles_map::get(const std::wstring & Name, odf_types::style_family::type Type)
{
@ -685,11 +688,14 @@ void docx_conversion_context::end_document()
{
output_stream() << L"</w:document>";
output_document_->get_word_files().set_document ( package::simple_element::create(L"document.xml", document_xml_.str()) );
output_document_->get_word_files().set_document ( package::simple_element::create(L"document.xml", document_xml_.str()) );
output_document_->get_word_files().set_settings ( package::simple_element::create(L"settings.xml", dump_settings_document()));
output_document_->get_word_files().set_media ( mediaitems_);
output_document_->get_word_files().set_comments ( comments_context_);
output_document_->get_word_files().set_headers_footers( headers_footers_);
output_document_->get_word_files().set_headers_footers( headers_footers_);
package::xl_drawings_ptr drawings = package::xl_drawings::create(chart_drawing_handle_->content(), chart_drawing_handle_->content_vml());
output_document_->get_word_files().set_drawings(drawings);
package::content_types_file & content_file_ = output_document_->get_content_types_file();
content_file_.set_media( mediaitems_);
@ -814,6 +820,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();
@ -1464,7 +1480,7 @@ void docx_conversion_context::end_text_list_style()
text_list_style_name_ = L"";
}
const std::wstring & docx_conversion_context::get_text_list_style_name()
std::wstring docx_conversion_context::get_text_list_style_name()
{
return text_list_style_name_;
}
@ -1490,9 +1506,9 @@ void docx_conversion_context::end_list()
list_style_stack_.pop_back();
}
const std::wstring docx_conversion_context::current_list_style() const
std::wstring docx_conversion_context::current_list_style()
{
if (!list_style_stack_.empty())
if (false == list_style_stack_.empty())
return list_style_stack_.back();
else
return L"";
@ -1545,6 +1561,92 @@ int docx_conversion_context::process_text_attr(odf_reader::text::paragraph_attrs
push_text_properties(styleContent->get_style_text_properties());
return 1;
}
int docx_conversion_context::process_paragraph_style(const std::wstring & style_name)
{
if (style_name.empty()) return 0;
if (odf_reader::style_instance * styleInst =
root()->odf_context().styleContainer().style_by_name(style_name, odf_types::style_family::Paragraph, process_headers_footers_))
{
double font_size = odf_reader::text_format_properties_content::process_font_size_impl(odf_types::font_size(odf_types::percent(100.0)), styleInst);
if (font_size > 0) current_fontSize.push_back(font_size);
process_page_break_after(styleInst);
if (styleInst->is_automatic())
{
if (odf_reader::style_content * styleContent = styleInst->content())
{
std::wstring id;
//office_element_ptr parent_tab_stops_;
if (const odf_reader::style_instance * parentStyleContent = styleInst->parent())
{
std::wstring parent_name = parentStyleContent->name();
id = styles_map_.get( parent_name, parentStyleContent->type() );
if (in_table_content_ && table_content_context_.empty_current_table_content_level_index())
{
table_content_context_.set_current_level(parent_name);
}
}
start_automatic_style(id);
calc_tab_stops(styleInst, get_tabs_context());
//вытаскивает rtl c цепочки стилей !! - просто прописать в наследуемом НЕЛЬЗЯ !!
odf_reader::paragraph_format_properties properties = odf_reader::calc_paragraph_properties_content(styleInst);
if (properties.style_writing_mode_)
{
odf_types::writing_mode::type type = properties.style_writing_mode_->get_type();
switch(type)
{
case odf_types::writing_mode::RlTb:
case odf_types::writing_mode::TbRl:
case odf_types::writing_mode::Rl:
set_rtl(true);
break;
default:
set_rtl(false);
}
}
styleContent->docx_convert(*this);
end_automatic_style();
//push_text_properties(styleContent->get_style_text_properties());
return 1;
}
}
else
{
const std::wstring id = styles_map_.get( styleInst->name(), styleInst->type() );
output_stream() << L"<w:pPr>";
output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
if (!get_text_tracked_context().dumpPPr_.empty())
{
output_stream() << get_text_tracked_context().dumpPPr_;
get_text_tracked_context().dumpPPr_.clear();
}
serialize_list_properties(output_stream());
if (!get_text_tracked_context().dumpRPrInsDel_.empty())
{
output_stream() << L"<w:rPr>";
output_stream() << get_text_tracked_context().dumpRPrInsDel_;
get_text_tracked_context().dumpRPrInsDel_.clear();
output_stream() << L"</w:rPr>";
}
output_stream() << L"</w:pPr>";
return 2;
}
}
return 0;
}
int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_attrs *Attr)
{
if (!Attr) return 0;
@ -1565,22 +1667,22 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
if (odf_reader::style_instance * styleInst =
root()->odf_context().styleContainer().style_by_name(Attr->text_style_name_, odf_types::style_family::Paragraph, process_headers_footers_)
)
{
{
double font_size = odf_reader::text_format_properties_content::process_font_size_impl(odf_types::font_size(odf_types::percent(100.0)), styleInst);
if (font_size > 0) current_fontSize.push_back(font_size);
process_page_break_after(styleInst);
process_page_break_after(styleInst);
if (styleInst->is_automatic())
{
if (odf_reader::style_content * styleContent = styleInst->content())
{
std::wstring id;
{
if (odf_reader::style_content * styleContent = styleInst->content())
{
std::wstring id;
//office_element_ptr parent_tab_stops_;
if (const odf_reader::style_instance * parentStyleContent = styleInst->parent())
if (const odf_reader::style_instance * parentStyleContent = styleInst->parent())
{
std::wstring parent_name = parentStyleContent->name();
id = styles_map_.get( parent_name, parentStyleContent->type() );
id = styles_map_.get( parent_name, parentStyleContent->type() );
if (in_table_content_ && table_content_context_.empty_current_table_content_level_index())
{
@ -1588,7 +1690,7 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
}
}
start_automatic_style(id);
start_automatic_style(id);
calc_tab_stops(styleInst, get_tabs_context());
@ -1608,16 +1710,15 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
set_rtl(false);
}
}
set_margin_left(properties.fo_margin_left_? 20.0 * properties.fo_margin_left_->get_length().get_value_unit(odf_types::length::pt) : 0);
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
set_outline_level(*Attr->outline_level_ - 1);
}
styleContent->docx_convert(*this);
end_automatic_style();
push_text_properties(styleContent->get_style_text_properties());
push_text_properties(styleContent->get_style_text_properties());
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
@ -1633,6 +1734,8 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
//process_paragraph_style(Context.get_current_paragraph_style()); ??
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
output_stream() << L"<w:pPr>";
@ -1652,58 +1755,58 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
}
}
return 1;
}
}
else
{
const std::wstring id = styles_map_.get( styleInst->name(), styleInst->type() );
output_stream() << L"<w:pPr>";
//todooo причесать
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
&& (get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
}
}
else
{
const std::wstring id = styles_map_.get( styleInst->name(), styleInst->type() );
output_stream() << L"<w:pPr>";
//todooo причесать
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
&& (get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{
if (is_paragraph_header() )
{
if (is_paragraph_header() )
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
output_stream() << L"<w:pPr>";
}
else
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
}
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
output_stream() << L"<w:pPr>";
}
output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
if (!get_text_tracked_context().dumpPPr_.empty())
else
{
output_stream() << get_text_tracked_context().dumpPPr_;
get_text_tracked_context().dumpPPr_.clear();
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
}
}
serialize_list_properties(output_stream());
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\" />";
}
output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
if (!get_text_tracked_context().dumpRPrInsDel_.empty())
{
output_stream() << L"<w:rPr>";
output_stream() << get_text_tracked_context().dumpRPrInsDel_;
get_text_tracked_context().dumpRPrInsDel_.clear();
output_stream() << L"</w:rPr>";
}
output_stream() << L"</w:pPr>";
if (!get_text_tracked_context().dumpPPr_.empty())
{
output_stream() << get_text_tracked_context().dumpPPr_;
get_text_tracked_context().dumpPPr_.clear();
}
serialize_list_properties(output_stream());
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\" />";
}
if (!get_text_tracked_context().dumpRPrInsDel_.empty())
{
output_stream() << L"<w:rPr>";
output_stream() << get_text_tracked_context().dumpRPrInsDel_;
get_text_tracked_context().dumpRPrInsDel_.clear();
output_stream() << L"</w:rPr>";
}
output_stream() << L"</w:pPr>";
return 2;
}
}
@ -1754,28 +1857,27 @@ void docx_conversion_context::process_page_break_after(const odf_reader::style_i
}
void docx_conversion_context::serialize_list_properties(std::wostream & strm)
{
if (!list_style_stack_.empty())
if (list_style_stack_.empty()) return;
if (first_element_list_item_)
{
if (first_element_list_item_)
{
const int id = root()->odf_context().listStyleContainer().id_by_name( current_list_style() );
const int id = root()->odf_context().listStyleContainer().id_by_name( current_list_style() );
CP_XML_WRITER(strm)
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"w:numPr")
{
CP_XML_NODE(L"w:numPr")
CP_XML_NODE(L"w:ilvl")
{
CP_XML_NODE(L"w:ilvl")
{
CP_XML_ATTR(L"w:val", (list_style_stack_.size() - 1));
}
CP_XML_NODE(L"w:numId")
{
CP_XML_ATTR(L"w:val", id );
}
CP_XML_ATTR(L"w:val", (list_style_stack_.size() - 1));
}
CP_XML_NODE(L"w:numId")
{
CP_XML_ATTR(L"w:val", id );
}
}
first_element_list_item_ = false;
}
}
first_element_list_item_ = false;
}
}
@ -1831,7 +1933,7 @@ namespace
//слить если есть mediaitems, добавить релсы и обнулить их для основного документа.
rels internal_rels;
Context.get_mediaitems().dump_rels(internal_rels);
Context.get_mediaitems()->dump_rels(internal_rels);
Context.dump_hyperlinks(internal_rels, hyperlinks::document_place);
Context.get_headers_footers().add(styleName, dbgStr, type, internal_rels);

View File

@ -42,6 +42,7 @@
#include "docx_table_context.h"
#include "oox_conversion_context.h"
#include "oox_chart_context.h"
#include "xlsx_drawing_context.h"
#include "headers_footers.h"
#include "hyperlinks.h"
@ -734,7 +735,7 @@ class docx_conversion_context : boost::noncopyable
public:
enum NoteType { noNote, footNote, footNoteRefSet, endNote, endNoteRefSet };
docx_conversion_context(odf_reader::odf_document * OdfDocument);
docx_conversion_context(odf_reader::odf_document * _odf_document);
~docx_conversion_context();
void set_output_document (package::docx_document * document);
@ -829,6 +830,7 @@ public:
bool process_page_properties(std::wostream & strm);
void process_section (std::wostream & strm, odf_reader::style_columns * columns = NULL);
int process_paragraph_style (const std::wstring & style_name);
int process_paragraph_attr (odf_reader::text::paragraph_attrs *attr);
int process_text_attr (odf_reader::text::paragraph_attrs *Attr);
void process_page_break_after(const odf_reader::style_instance *styleInst);
@ -872,8 +874,8 @@ public:
void start_text_list_style (const std::wstring & StyleName);
void end_text_list_style ();
const std::wstring & get_text_list_style_name();
const std::wstring current_list_style () const;
std::wstring get_text_list_style_name();
std::wstring current_list_style();
void start_list (const std::wstring & StyleName, bool Continue = false);
void end_list ();
@ -887,7 +889,7 @@ public:
styles_map * get_style_map() { return &styles_map_; }
mediaitems & get_mediaitems() {return mediaitems_;}
mediaitems_ptr & get_mediaitems() {return mediaitems_;}
styles_context & get_styles_context() { return styles_context_; }
drawing_context & get_drawing_context() { return drawing_context_; }
comments_context & get_comments_context() { return comments_context_; }
@ -897,8 +899,9 @@ public:
text_tracked_context& get_text_tracked_context(){ return text_tracked_context_; }
forms_context & get_forms_context() { return forms_context_; }
tabs_context & get_tabs_context() { return tabs_context_;}
table_content_context & get_table_content_context() { return table_content_context_;}
table_content_context & get_table_content_context() { return table_content_context_;}
xlsx_drawing_context_handle_ptr & get_chart_drawing_handle() { return chart_drawing_handle_;}
void set_drawing_text_props (const std::wstring &props);
@ -916,9 +919,6 @@ public:
double get_current_fontSize() {return current_fontSize.empty() ? 0 : current_fontSize.back();}
void pop_current_fontSize() {if (!current_fontSize.empty()) current_fontSize.pop_back();}
void set_margin_left(int val) {current_margin_left_ = val;}
int get_margin_left() {return current_margin_left_;}
void set_outline_level(int val) {current_outline_level_ = val;}
int get_outline_level() {return current_outline_level_;}
@ -926,6 +926,10 @@ public:
NoteType get_process_note () const { return current_process_note_; }
void add_note_reference ();
void start_paragraph_style(const std::wstring& style_name) {paragraph_style_stack_.push_back(style_name);}
void end_paragraph_style() { if (!paragraph_style_stack_.empty()) paragraph_style_stack_.pop_back();}
std::wstring get_current_paragraph_style() {return paragraph_style_stack_.empty() ? L"" : paragraph_style_stack_.back();}
oox_chart_context & current_chart();
void start_chart(std::wstring name);
void end_chart ();
@ -950,7 +954,7 @@ public:
headers_footers & get_headers_footers() { return headers_footers_; }
header_footer_context & get_header_footer_context() { return header_footer_context_; }
drop_cap_context & get_drop_cap_context() {return drop_cap_context_;}
drop_cap_context & get_drop_cap_context() { return drop_cap_context_; }
styles_map styles_map_;
bool process_headers_footers_;
@ -988,6 +992,8 @@ private:
std::wstringstream settings_xml_;
std::wstringstream meta_xml_;
xlsx_drawing_context_handle_ptr chart_drawing_handle_;
styles_context styles_context_;
math_context math_context_;
drawing_context drawing_context_;
@ -1010,14 +1016,14 @@ private:
std::vector<odf_reader::_property> settings_properties_;
hyperlinks hyperlinks_;
mediaitems mediaitems_;
mediaitems_ptr mediaitems_;
std::vector<oox_chart_context_ptr> charts_;
headers_footers headers_footers_;
std::wstring automatic_parent_style_;
std::wstring current_master_page_name_;
std::wstring text_list_style_name_;
std::wstring text_list_style_name_;
std::vector<std::wstring> paragraph_style_stack_;
std::vector<std::wstring> list_style_stack_;
std::vector<std::wstring> fields_names_stack_;

View File

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

@ -102,7 +102,11 @@ void word_files::write(const std::wstring & RootPath)
{
embeddings_->write( path );
}
if (drawings_)
{
drawings_->set_main_document(get_main_document());
drawings_->write( path );
}
if (headers_footers_)
{
headers_footers_->write( path );
@ -140,22 +144,22 @@ void word_files::write(const std::wstring & RootPath)
void word_files::update_rels(docx_conversion_context & Context)
{
Context.get_mediaitems().dump_rels(rels_files_.get_rel_file()->get_rels());
Context.get_mediaitems()->dump_rels(rels_files_.get_rel_file()->get_rels());
Context.dump_hyperlinks (rels_files_.get_rel_file()->get_rels(), hyperlinks::document_place);
Context.dump_headers_footers(rels_files_.get_rel_file()->get_rels());
Context.dump_notes (rels_files_.get_rel_file()->get_rels());
}
void word_files::set_media(mediaitems & _Mediaitems)
void word_files::set_media(mediaitems_ptr & _mediaitems)
{
if (_Mediaitems.count_image + _Mediaitems.count_media > 0)
if (_mediaitems->count_image + _mediaitems->count_media > 0)
{
media_ = element_ptr( new media(_Mediaitems, _Mediaitems.applicationFonts()) );
media_ = element_ptr( new media(_mediaitems, _mediaitems->applicationFonts()) );
}
if (_Mediaitems.count_object > 0)
if (_mediaitems->count_object > 0)
{
embeddings_ = element_ptr( new embeddings(_Mediaitems) );
embeddings_ = element_ptr( new embeddings(_mediaitems) );
embeddings_->set_main_document( get_main_document() );
}
}
@ -195,6 +199,10 @@ void word_files::add_jsaProject(const std::string &content)
{
jsaProject_ = package::simple_element::create(L"jsaProject.bin", content);
}
void word_files::set_drawings(element_ptr Element)
{
drawings_ = Element;
}
void word_files::set_headers_footers(headers_footers & HeadersFooters)
{
headers_footers_elements * elm = new headers_footers_elements(HeadersFooters);

View File

@ -137,10 +137,11 @@ public:
void set_numbering (element_ptr Element);
void set_settings (element_ptr Element);
bool has_numbering ();
void set_media (mediaitems & mediaitems_);
void set_media (mediaitems_ptr & mediaitems_);
void set_headers_footers(headers_footers & HeadersFooters);
void set_notes (notes_context & notesContext);
void set_comments (comments_context & commentsContext);
void set_drawings (element_ptr Element);
void add_charts(chart_content_ptr chart);
void add_jsaProject(const std::string &content);
@ -163,6 +164,7 @@ private:
element_ptr settings_;
element_ptr comments_;
element_ptr jsaProject_;
element_ptr drawings_;
};

View File

@ -62,6 +62,9 @@ struct drawing_object_description
double anchor_x_;
double anchor_y_;
_CP_OPT(_INT32) owner_cx_;
_CP_OPT(_INT32) owner_cy_;
_action_desc action_;
std::vector<_hlink_desc> hlinks_;

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

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

View File

@ -101,6 +101,7 @@ void mediaitems::set_font_directory(std::wstring pathFonts)
if (applicationFonts_)
applicationFonts_->InitializeFromFolder(pathFonts);
}
std::wstring mediaitems::add_or_find(const std::wstring & href, RelsType type, bool & isInternal)
{
std::wstring ref;
@ -336,6 +337,10 @@ void mediaitems::dump_rels(rels & Rels)
{
for (size_t i = 0; i < items_.size(); i++)
{
if ( items_[i].type == typeUnknown ) continue;
if ( items_[i].type == typeShape ) continue;
if ( items_[i].type == typeGroupShape ) continue;
if (items_[i].count_used >= items_[i].count_add) continue; // уже использовали этот релс выше(колонтитул ....)
Rels.add( relationship(
@ -345,7 +350,7 @@ void mediaitems::dump_rels(rels & Rels)
items_[i].mediaInternal ? L"" : L"External" )
);
items_[i].count_used++;
}
}
}

View File

@ -137,6 +137,7 @@ public:
return typeMedia;
}
private:
std::wstring create_file_name (const std::wstring & uri, RelsType type, bool & isInternal, size_t Num);
std::wstring detectImageFileExtension (const std::wstring &fileName);
@ -147,6 +148,7 @@ private:
NSFonts::IApplicationFonts *applicationFonts_;
};
typedef _CP_PTR(mediaitems) mediaitems_ptr;
}
}

View File

@ -53,7 +53,7 @@ public:
std::wstring drawingId_;
};
oox_chart_context::oox_chart_context(mediaitems & m, std::wstring name) :
oox_chart_context::oox_chart_context(mediaitems_ptr & m, std::wstring name) :
impl_(new oox_chart_context::Impl( name)), mediaitems_(m)
{
@ -65,7 +65,7 @@ void oox_chart_context::reset_fill(oox::_oox_fill &f)
{
bool isInternal = true;
std::wstring ref;
f.bitmap->rId = mediaitems_.add_or_find(f.bitmap->xlink_href_, typeImage, isInternal, ref);
f.bitmap->rId = mediaitems_->add_or_find(f.bitmap->xlink_href_, typeImage, isInternal, ref);
rels_.push_back(_rel(isInternal, f.bitmap->rId, ref, typeImage));
}
@ -75,9 +75,15 @@ void oox_chart_context::set_externalData(const std::wstring & href)
bool isInternal = true;
std::wstring href_out;
externalDataId_ = mediaitems_.add_or_find(href, typeMsObject, isInternal, href_out);
externalDataId_ = mediaitems_->add_or_find(href, typeMsObject, isInternal, href_out);
rels_.push_back(_rel(isInternal, externalDataId_, href_out, typeMsObject));
}
void oox_chart_context::set_userShapes(std::pair<std::wstring, std::wstring> &link)
{
bool isInternal = true;
userShapesId_ = link.second;
rels_.push_back(_rel(isInternal, userShapesId_, link.first, typeChartUserShapes));
}
std::wostream & oox_chart_context::chartData()
{
return impl_->chartData_;
@ -116,6 +122,15 @@ void oox_chart_context::dump_rels(rels & Rels)
(r.is_internal ? L"" : L"External"))
);
}
else if (r.type == typeChartUserShapes)
{
Rels.add(relationship(
r.rid,
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartUserShapes",
r.is_internal ? std::wstring(L"../drawings/") + r.ref : r.ref,
(r.is_internal ? L"" : L"External"))
);
}
}
}
@ -226,6 +241,13 @@ void oox_chart_context::serialize(std::wostream & strm)
}
}
}
if (userShapesId_.empty() == false)
{
CP_XML_NODE(L"c:userShapes")
{
CP_XML_ATTR(L"r:id", userShapesId_);
}
}
}
}
}

View File

@ -53,7 +53,7 @@ typedef _CP_PTR(oox_chart_context) oox_chart_context_ptr;
class oox_chart_context
{
public:
oox_chart_context(mediaitems & mediaitems_, std::wstring name);
oox_chart_context(mediaitems_ptr & mediaitems_, std::wstring name);
~oox_chart_context();
std::wostream & chartData();
@ -83,6 +83,8 @@ public:
}
}
void set_externalData(const std::wstring & href);
void set_userShapes(std::pair<std::wstring, std::wstring> &link);
void add_chart(int type)
{
plot_area_.add_chart(type);
@ -128,7 +130,7 @@ private:
class Impl;
_CP_SCOPED_PTR(Impl) impl_;
mediaitems &mediaitems_;
mediaitems_ptr mediaitems_;
std::vector<_rel> rels_;
cpdoccore::oox::oox_title title_;
@ -137,6 +139,7 @@ private:
std::wstring pivot_source_;
std::wstring externalDataId_;
std::wstring userShapesId_;
std::vector<odf_reader::_property> graphic_properties_;
_oox_fill fill_;

View File

@ -99,17 +99,23 @@ void tabs_context::reset()
odf_reader::style_tab_stop *tab_stop = dynamic_cast<odf_reader::style_tab_stop*>(tabs[i].get());
if (tab_stop)
{
clear_tabs.insert(std::make_pair(tab_stop->style_position_.get_value(), tabs[i]));
double pos = tab_stop->margin_left + tab_stop->style_position_.get_value_unit(odf_types::length::pt);
clear_tabs.insert(std::make_pair((int)pos, tabs[i]));
}
}
tabs.clear();
}
void tabs_context::add(const odf_reader::office_element_ptr & element)
void tabs_context::add(const odf_reader::office_element_ptr & element, double margin_left)
{
odf_reader::style_tab_stop *tab_stop = dynamic_cast<odf_reader::style_tab_stop*>(element.get());
if (tab_stop)
{
std::map<double, odf_reader::office_element_ptr>::iterator pFind = clear_tabs.find(tab_stop->style_position_.get_value());
tab_stop->margin_left = margin_left;
double pos = margin_left + tab_stop->style_position_.get_value_unit(odf_types::length::pt);
std::map<int, odf_reader::office_element_ptr>::iterator pFind = clear_tabs.find((int)pos);
if (pFind != clear_tabs.end())
{
@ -126,7 +132,7 @@ void tabs_context::docx_convert(oox::docx_conversion_context & Context)
_pPr << L"<w:tabs>";
for (std::map<double, odf_reader::office_element_ptr>::iterator it = clear_tabs.begin(); it != clear_tabs.end(); ++it)
for (std::map<int, odf_reader::office_element_ptr>::iterator it = clear_tabs.begin(); it != clear_tabs.end(); ++it)
{
odf_reader::style_tab_stop * tab_stop = dynamic_cast<odf_reader::style_tab_stop*>(it->second.get());
tab_stop->docx_convert(Context, true);

View File

@ -110,7 +110,7 @@ class tabs_context : boost::noncopyable
public:
std::vector<odf_reader::office_element_ptr> tabs;
std::map<double, odf_reader::office_element_ptr> clear_tabs;
std::map<int, odf_reader::office_element_ptr> clear_tabs;
void clear()
{
@ -120,7 +120,7 @@ public:
void reset();
void add(const odf_reader::office_element_ptr & element);
void add(const odf_reader::office_element_ptr & element, double margin_left);
void docx_convert(oox::docx_conversion_context & Context);
};
class styles_context : boost::noncopyable

View File

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

View File

@ -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,7 +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

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

View File

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

View File

@ -173,6 +173,26 @@ bool content_types_file::add_or_find_override(const std::wstring & fileName)
return true;
}
void content_types_file::set_media(mediaitems_ptr & _Mediaitems)
{
std::vector<mediaitems::item> & items_ = _Mediaitems->items();
for (size_t i = 0; i < items_.size(); i++)
{
if ((items_[i].type == typeImage ||
items_[i].type == typeMedia ||
items_[i].type == typeVideo ||
items_[i].type == typeAudio) && items_[i].mediaInternal)
{
int n = items_[i].outputName.rfind(L".");
if (n > 0)
{
add_or_find_default(items_[i].outputName.substr(n + 1, items_[i].outputName.length() - n));
}
}
}
}
void content_types_file::set_media(mediaitems & _Mediaitems)
{
@ -349,7 +369,7 @@ void docProps_files::write(const std::wstring & RootPath)
////////////
media::media(mediaitems & _Mediaitems, NSFonts::IApplicationFonts *pAppFonts) : mediaitems_(_Mediaitems), appFonts_(pAppFonts)
media::media(mediaitems_ptr & _mediaitems, NSFonts::IApplicationFonts *pAppFonts) : mediaItems_(_mediaitems), appFonts_(pAppFonts)
{
}
@ -358,7 +378,8 @@ void media::write(const std::wstring & RootPath)
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"media";
NSDirectory::CreateDirectory(path.c_str());
mediaitems::items_array & items = mediaitems_.items();
mediaitems::items_array & items = mediaItems_->items();
for (size_t i = 0; i < items.size(); i++ )
{
if (items[i].mediaInternal && items[i].valid && ( items[i].type == typeImage ||
@ -381,7 +402,7 @@ void media::write(const std::wstring & RootPath)
}
//------------------------------------------------------------------------------------------------------------
charts::charts(mediaitems & _ChartsItems) : chartsitems_(_ChartsItems)
charts::charts(mediaitems_ptr & _chartsItems) : chartsItems_(_chartsItems)
{
}
@ -390,7 +411,7 @@ void charts::write(const std::wstring & RootPath)
}
//--------------------------------------------------------------------------------------------------------------
embeddings::embeddings(mediaitems & _EmbeddingsItems) : embeddingsitems_(_EmbeddingsItems)
embeddings::embeddings(mediaitems_ptr & _EmbeddingsItems) : embeddingsItems_(_EmbeddingsItems)
{
}
void embeddings::write(const std::wstring & RootPath)
@ -400,7 +421,8 @@ void embeddings::write(const std::wstring & RootPath)
content_types_file & content_types = get_main_document()->get_content_types_file();
mediaitems::items_array & items = embeddingsitems_.items();
mediaitems::items_array & items = embeddingsItems_->items();
for (size_t i = 0; i < items.size(); i++ )
{
if ( items[i].mediaInternal && items[i].valid &&

View File

@ -51,6 +51,7 @@ namespace cpdoccore {
namespace oox {
class mediaitems;
typedef _CP_PTR(mediaitems) mediaitems_ptr;
namespace package {
@ -81,16 +82,17 @@ inline element::~element()
class content_types_file : public element
{
public:
content_types_file ();
void write (const std::wstring & RootPath);
bool add_or_find_default (const std::wstring & extension);
bool add_or_find_override(const std::wstring & fileName);
void set_media (mediaitems & _Mediaitems);
content_type * content ();
content_types_file ();
void write (const std::wstring & RootPath);
bool add_or_find_default (const std::wstring & extension);
bool add_or_find_override(const std::wstring & fileName);
void set_media (mediaitems & _Mediaitems);
void set_media (mediaitems_ptr & _Mediaitems);
content_type* content ();
private:
content_type content_type_content_;
std::wstring filename_;
std::wstring filename_;
};
class simple_element;
@ -189,8 +191,8 @@ public:
std::wstring str() { return content_.str(); }
static _CP_PTR(chart_content) create();
private:
std::wstringstream content_;
rels_file_ptr rels_;
std::wstringstream content_;
rels_file_ptr rels_;
};
//------------------------------------------------------------------------
class document : public element
@ -228,39 +230,39 @@ private:
class media : public element
{
public:
media(mediaitems & _Mediaitems, NSFonts::IApplicationFonts *pAppFonts);
media(mediaitems_ptr & _mediaItems, NSFonts::IApplicationFonts *pAppFonts);
public:
virtual void write(const std::wstring & RootPath);
private:
mediaitems & mediaitems_;
NSFonts::IApplicationFonts * appFonts_;
mediaitems_ptr mediaItems_;
NSFonts::IApplicationFonts* appFonts_;
};
class charts : public element
{
public:
charts(mediaitems & _ChartsItems);
charts(mediaitems_ptr & _chartsItems);
public:
virtual void write(const std::wstring & RootPath);
private:
mediaitems & chartsitems_;
mediaitems_ptr chartsItems_;
};
class embeddings : public element
{
public:
embeddings(mediaitems & _EmbeddingsItems);
embeddings(mediaitems_ptr & _embeddingsItems);
public:
virtual void write(const std::wstring & RootPath);
private:
mediaitems & embeddingsitems_;
mediaitems_ptr embeddingsItems_;
};
} // namespace package

View File

@ -43,6 +43,7 @@ namespace oox {
enum RelsType
{
typeUnknown = 0,
typeDefault,
typeImage,
typeChart,
typeShape,
@ -59,7 +60,8 @@ enum RelsType
typeExternalLink,
typeActiveX,
typeControl,
typeControlProps
typeControlProps,
typeChartUserShapes
};
struct _rel
@ -71,10 +73,10 @@ struct _rel
type(type_)
{}
bool is_internal;
std::wstring rid;
std::wstring ref;
RelsType type;
bool is_internal;
std::wstring rid;
std::wstring ref;
RelsType type;
};
class relationship : public xml::element_impl<relationship>

View File

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

View File

@ -83,7 +83,7 @@ void pptx_conversion_context::set_output_document(package::pptx_document * docum
void pptx_conversion_context::set_font_directory(std::wstring pathFonts)
{
pptx_slide_context_.get_mediaitems().set_font_directory(pathFonts);
pptx_slide_context_.get_mediaitems()->set_font_directory(pathFonts);
}
void pptx_conversion_context::process_layouts()

View File

@ -133,7 +133,7 @@ public:
pptx_table_context & get_table_context() { return pptx_table_context_; }
mediaitems & get_mediaitems() { return pptx_slide_context_.get_mediaitems(); }
mediaitems_ptr & get_mediaitems() { return pptx_slide_context_.get_mediaitems(); }
//void start_hyperlink(const std::wstring & styleName);
//void end_hyperlink(std::wstring const & href);

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

@ -509,15 +509,15 @@ void ppt_files::add_notesMaster(slide_content_ptr slide)
{
notesMaster_files_.add_slide(slide);
}
void ppt_files::set_media(mediaitems & _Mediaitems)
void ppt_files::set_media(mediaitems_ptr & _mediaitems)
{
if (_Mediaitems.count_image + _Mediaitems.count_media > 0)
if (_mediaitems->count_image + _mediaitems->count_media > 0)
{
media_ = element_ptr( new media(_Mediaitems, _Mediaitems.applicationFonts()) );
media_ = element_ptr( new media(_mediaitems, _mediaitems->applicationFonts()) );
}
if (_Mediaitems.count_object > 0)
if (_mediaitems->count_object > 0)
{
embeddings_ = element_ptr( new embeddings(_Mediaitems) );
embeddings_ = element_ptr( new embeddings(_mediaitems) );
}
}
void ppt_files::set_authors_comments(pptx_xml_authors_comments_ptr & authors_comments)

View File

@ -217,7 +217,7 @@ public:
void add_notes (slide_content_ptr sheet);
void add_notesMaster(slide_content_ptr sheet);
void set_media(mediaitems & _Mediaitems);
void set_media(mediaitems_ptr & _mediaitems);
void add_charts(chart_content_ptr chart);
void add_theme (pptx_xml_theme_ptr theme);

View File

@ -65,8 +65,10 @@ public:
bool onClick;
};
Impl(const std::wstring & odfPacket) : mediaitems_(odfPacket), odfPacket_(odfPacket)
Impl(const std::wstring & _odfPacket) : odfPacket_(_odfPacket)
{
mediaitems_ = boost::make_shared<mediaitems>(odfPacket_);
clear();
}
@ -88,7 +90,7 @@ public:
{
pptx_drawings_->add(isInternal, rid, ref, type);
}
mediaitems & get_mediaitems() { return mediaitems_; }
mediaitems_ptr & get_mediaitems() { return mediaitems_; }
bool empty() const
{
@ -138,7 +140,7 @@ private:
void process_media (drawing_object_description& obj, _pptx_drawing & drawing);
size_t rId_;
mediaitems mediaitems_;
mediaitems_ptr mediaitems_;
pptx_drawings_ptr pptx_drawings_;
pptx_drawings_ptr pptx_notes_drawings_;
};
@ -357,7 +359,7 @@ void pptx_slide_context::add_background(_oox_fill & fill)
bool isMediaInternal = false;
std::wstring ref;
fill.bitmap->rId = get_mediaitems().add_or_find(fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
fill.bitmap->rId = get_mediaitems()->add_or_find(fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
add_rels(isMediaInternal, fill.bitmap->rId, ref, typeImage);
}
impl_->background_fill_ = fill;
@ -421,7 +423,7 @@ void pptx_slide_context::set_link(std::wstring link, RelsType typeRels)
{
bool isMediaInternal = true;
impl_->object_description_.action_.hSoundId = get_mediaitems().add_or_find(link, typeAudio, isMediaInternal, impl_->object_description_.action_.hSoundRef);
impl_->object_description_.action_.hSoundId = get_mediaitems()->add_or_find(link, typeAudio, isMediaInternal, impl_->object_description_.action_.hSoundRef);
impl_->add_additional_rels(isMediaInternal, impl_->object_description_.action_.hSoundId, impl_->object_description_.action_.hSoundRef, typeAudio);
}
else
@ -566,7 +568,7 @@ void pptx_slide_context::Impl::process_image(drawing_object_description& obj, _p
}
std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + obj.xlink_href_;
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, fileName, drawing.fill.bitmap->cropRect, get_mediaitems().applicationFonts());
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, fileName, drawing.fill.bitmap->cropRect, get_mediaitems()->applicationFonts());
drawing.fill.bitmap->bStretch = true;
if ((sColorMode) && (*sColorMode == L"greyscale"))
@ -576,7 +578,7 @@ void pptx_slide_context::Impl::process_image(drawing_object_description& obj, _p
std::wstring ref;/// это ссылка на выходной внешний объект
bool isMediaInternal = false;
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(obj.xlink_href_, typeImage, isMediaInternal, ref);
drawing.fill.bitmap->rId = get_mediaitems()->add_or_find(obj.xlink_href_, typeImage, isMediaInternal, ref);
drawing.fill.bitmap->isInternal = isMediaInternal;
if (drawing.type == typeShape)
@ -584,7 +586,7 @@ void pptx_slide_context::Impl::process_image(drawing_object_description& obj, _p
add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);//собственно это не объект, а доп рел и ref объекта
isMediaInternal = true;
std::wstring rId = get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
std::wstring rId = get_mediaitems()->add_or_find(L"", typeShape, isMediaInternal, ref);
add_drawing(drawing, isMediaInternal, rId, ref, typeShape);//объект
@ -599,7 +601,7 @@ void pptx_slide_context::Impl::process_chart(drawing_object_description & obj, _
std::wstring ref;
bool isMediaInternal = true;
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectId = get_mediaitems()->add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
}
@ -608,7 +610,7 @@ void pptx_slide_context::Impl::process_table(drawing_object_description & obj, _
{
std::wstring ref;
bool isMediaInternal = true;
std::wstring rId = get_mediaitems().add_or_find(L"", obj.type_, isMediaInternal, ref);
std::wstring rId = get_mediaitems()->add_or_find(L"", obj.type_, isMediaInternal, ref);
add_drawing(drawing, isMediaInternal, rId, ref, drawing.type);
@ -623,12 +625,12 @@ void pptx_slide_context::Impl::process_shape(drawing_object_description & obj, _
if (drawing.fill.bitmap)
{
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
drawing.fill.bitmap->rId = get_mediaitems()->add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);
}
std::wstring rId = get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
std::wstring rId = get_mediaitems()->add_or_find(L"", typeShape, isMediaInternal, ref);
////////////////////////////////////////////////////////////////
_CP_OPT(std::wstring) sPlaceHolderType;
@ -651,7 +653,7 @@ void pptx_slide_context::Impl::process_object(drawing_object_description& obj, _
std::wstring ref, ref_image;
bool isMediaInternal = true, isMediaInternal_image = true;
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectId = get_mediaitems()->add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectProgId = obj.descriptor_;
if (!drawing.fill.bitmap)
@ -662,7 +664,7 @@ void pptx_slide_context::Impl::process_object(drawing_object_description& obj, _
_image_file_::GenerateZeroImage(odfPacket_ + FILE_SEPARATOR_STR + L"zero.png");
}
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal_image, ref_image);
drawing.fill.bitmap->rId = get_mediaitems()->add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal_image, ref_image);
add_additional_rels(isMediaInternal_image, drawing.fill.bitmap->rId, ref_image, typeImage);
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
@ -674,7 +676,7 @@ void pptx_slide_context::Impl::process_media(drawing_object_description& obj, _p
drawing.type = mediaitems::detectMediaType(obj.xlink_href_); //reset from Media to Audio, Video, ... QuickTime? AudioCD? ...
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, drawing.type, isMediaInternal, ref);
drawing.objectId = get_mediaitems()->add_or_find(obj.xlink_href_, drawing.type, isMediaInternal, ref);
drawing.extId = L"ext" + drawing.objectId;
drawing.extExternal = !isMediaInternal;
@ -685,7 +687,7 @@ void pptx_slide_context::Impl::process_media(drawing_object_description& obj, _p
_image_file_::GenerateZeroImage(odfPacket_ + FILE_SEPARATOR_STR + L"zero.png");
}
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal_image, ref_image);
drawing.fill.bitmap->rId = get_mediaitems()->add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal_image, ref_image);
add_additional_rels(isMediaInternal_image, drawing.fill.bitmap->rId, ref_image, typeImage);
add_drawing(drawing, false, drawing.objectId, L"NULL", drawing.type);
@ -718,7 +720,7 @@ void pptx_slide_context::dump_rels(rels & Rels)
impl_->get_drawings()->dump_rels(Rels);
}
mediaitems & pptx_slide_context::get_mediaitems()
mediaitems_ptr & pptx_slide_context::get_mediaitems()
{
return impl_->get_mediaitems();
}

View File

@ -116,7 +116,7 @@ public:
void process_drawings();
mediaitems & get_mediaitems();
mediaitems_ptr & get_mediaitems();
void add_background (_oox_fill & fill);

View File

@ -390,7 +390,7 @@ void oox_serialize_tcPr(std::wostream & strm, std::vector<const odf_reader::styl
{
bool isMediaInternal = true;
std::wstring ref;
fill.bitmap->rId = Context.get_slide_context().get_mediaitems().add_or_find(fill.bitmap->xlink_href_, oox::typeImage, isMediaInternal, ref);
fill.bitmap->rId = Context.get_slide_context().get_mediaitems()->add_or_find(fill.bitmap->xlink_href_, oox::typeImage, isMediaInternal, ref);
Context.get_slide_context().add_rels(isMediaInternal, fill.bitmap->rId, ref, oox::typeImage);
}
oox::oox_serialize_fill(CP_XML_STREAM(), fill);

View File

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

View File

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

View File

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

View File

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

View File

@ -55,10 +55,17 @@ struct xlsx_dataValidation
std::wstring formula1;
std::wstring formula2;
std::wstring operator_;
bool showErrorMessage = false;
bool showInputMessage = false;
bool showDropDown = false;
bool allowBlank = false;
std::wstring error_text;
std::wstring error_title;
std::wstring promt_text;
std::wstring promt_title;
};
typedef shared_ptr<xlsx_dataValidation>::Type xlsx_dataValidation_ptr;
@ -103,24 +110,23 @@ public:
if (jt2_next == mapCells.end() || jt2->first + 1 != jt2_next->first)
break;
size_t j = 0; bool bFound = false;
for (size_t j = 0; j < jt2_next->second.size(); j++)
//size_t j = 0;
bool bFound = false;
for (std::vector<std::pair<int, int>>::iterator v_jt2 = jt2_next->second.begin();
v_jt2 != jt2_next->second.end(); ++v_jt2)
{
if (jt1->second[i].first == jt2_next->second[j].first ||
jt1->second[i].second == jt2_next->second[j].second)
if (jt1->second[i].first == v_jt2->first ||
jt1->second[i].second == v_jt2->second)
{
bFound = true;
jt2_next->second.erase(v_jt2);
break;
}
}
if (bFound)
{
jt2_next->second.erase(jt2_next->second.begin() + j, jt2_next->second.begin() + j + 1);
}
else
{
if (false == bFound)
break;
}
jt2 = jt2_next;
}
if (!activate_ref.empty()) activate_ref += L" ";
@ -135,11 +141,33 @@ public:
{
CP_XML_ATTR(L"sqref", activate_ref);
CP_XML_ATTR(L"allowBlank", it->second->allowBlank);
CP_XML_ATTR(L"operator", it->second->operator_);
if (!it->second->operator_.empty())
{
CP_XML_ATTR(L"operator", it->second->operator_);
}
CP_XML_ATTR(L"showDropDown", it->second->showDropDown);
CP_XML_ATTR(L"showErrorMessage", it->second->showErrorMessage);
CP_XML_ATTR(L"showInputMessage", it->second->showInputMessage);
CP_XML_ATTR(L"type", it->second->type);
if (!it->second->type.empty())
{
CP_XML_ATTR(L"type", it->second->type);
}
if (!it->second->error_title.empty())
{
CP_XML_ATTR(L"errorTitle", it->second->error_title);
}
if (!it->second->error_text.empty())
{
CP_XML_ATTR(L"error", it->second->error_text);
}
if (!it->second->promt_title.empty())
{
CP_XML_ATTR(L"promptTitle", it->second->promt_title);
}
if (!it->second->promt_text.empty())
{
CP_XML_ATTR(L"prompt", it->second->promt_text);
}
if (!it->second->formula1.empty())
{
@ -237,22 +265,26 @@ void xlsx_dataValidations_context::add(const std::wstring & name, const std::wst
impl_->mapDataValidations.insert(std::make_pair(name, _new));
}
void xlsx_dataValidations_context::add_help_msg(const std::wstring & name, bool val)
void xlsx_dataValidations_context::add_help_msg(const std::wstring & name, const std::wstring & title, const std::wstring & content, bool display)
{
std::map<std::wstring, xlsx_dataValidation_ptr>::iterator pFind = impl_->mapDataValidations.find(name);
if (pFind == impl_->mapDataValidations.end()) return;
pFind->second->showInputMessage = val;
pFind->second->showInputMessage = display;
pFind->second->promt_title = title;
pFind->second->promt_text = content;
}
void xlsx_dataValidations_context::add_error_msg(const std::wstring & name, bool val)
void xlsx_dataValidations_context::add_error_msg(const std::wstring & name, const std::wstring & title, const std::wstring & content, bool display)
{
std::map<std::wstring, xlsx_dataValidation_ptr>::iterator pFind = impl_->mapDataValidations.find(name);
if (pFind == impl_->mapDataValidations.end()) return;
pFind->second->showErrorMessage = val;
pFind->second->showErrorMessage = display;
pFind->second->error_title = title;
pFind->second->error_text = content;
}
void xlsx_dataValidations_context::add_formula(const std::wstring & name, const std::wstring & f) // todooo пооптимальней
{
@ -261,10 +293,10 @@ void xlsx_dataValidations_context::add_formula(const std::wstring & name, const
if (pFind == impl_->mapDataValidations.end()) return;
formulasconvert::odf2oox_converter converter;
int pos = -1;
std::wstring val;
size_t pos;
std::wstring val, val2;
if ( 0 <= (pos = f.find(L"cell-content-is-in-list"))) //oooc: , of:
if ( std::wstring::npos != (pos = f.find(L"cell-content-is-in-list"))) //oooc: , of:
{
pFind->second->type = L"list";
val = f.substr(24 + pos, f.size() - 25 - pos);
@ -287,6 +319,108 @@ void xlsx_dataValidations_context::add_formula(const std::wstring & name, const
pFind->second->formula1 = converter.convert(val);
}
}
else if ( std::wstring::npos != (pos = f.find(L"is-true-formula")))
{
pFind->second->type = L"custom";
val = f.substr(16 + pos, f.size() - 17 - pos);
pFind->second->formula1 = converter.convert(val);
}
else
{
if (std::wstring::npos != (pos = f.find(L"cell-content-is-date")))
{
pFind->second->type = L"date";
}
else if (std::wstring::npos != (pos = f.find(L"cell-content-is-decimal-number")))
{
pFind->second->type = L"decimal";
}
else if (std::wstring::npos != (pos = f.find(L"cell-content-is-time")))
{
pFind->second->type = L"time";
}
else if (std::wstring::npos != (pos = f.find(L"cell-content-is-whole-number")))
{
pFind->second->type = L"whole";
}
if (std::wstring::npos != (pos = f.find(L"cell-content()==")))
{
pFind->second->operator_ = L"equal";
size_t pos2 = f.find(L"and", pos + 16);
if (pos2 == std::wstring::npos) pos2 = f.length();
val = f.substr(pos + 16, pos2 - pos - 16);
}
else if (std::wstring::npos != (pos = f.find(L"cell-content()<>")))
{
pFind->second->operator_ = L"notEqual";
size_t pos2 = f.find(L"and", pos + 16);
if (pos2 == std::wstring::npos) pos2 = f.length();
val = f.substr(pos + 16, pos2 - pos - 16);
}
else if (std::wstring::npos != (pos = f.find(L"cell-content()<=")))
{
pFind->second->operator_ = L"lessThanOrEqual";
size_t pos2 = f.find(L"and", pos + 16);
if (pos2 == std::wstring::npos) pos2 = f.length();
val = f.substr(pos + 16, pos2 - pos - 16);
}
else if (std::wstring::npos != (pos = f.find(L"cell-content()<")))
{
pFind->second->operator_ = L"lessThan";
size_t pos2 = f.find(L"and", pos + 15);
if (pos2 == std::wstring::npos) pos2 = f.length();
val = f.substr(pos + 15, pos2 - pos - 15);
}
else if (std::wstring::npos != (pos = f.find(L"cell-content()>=")))
{
pFind->second->operator_ = L"greaterThanOrEqual";
size_t pos2 = f.find(L"and", pos + 16);
if (pos2 == std::wstring::npos) pos2 = f.length();
val = f.substr(pos + 16, pos2 - pos - 16);
}
else if (std::wstring::npos != (pos = f.find(L"cell-content()>")))
{
pFind->second->operator_ = L"greaterThan";
size_t pos2 = f.find(L"and", pos + 15);
if (pos2 == std::wstring::npos) pos2 = f.length();
val = f.substr(pos + 15, pos2 - pos - 15);
}
else if (std::wstring::npos != (pos = f.find(L"cell-content-is-not-between(")))
{
pFind->second->operator_ = L"greaterThanOrEqual";
size_t pos2 = f.find(L",", pos + 27);
size_t pos3 = f.rfind(L")");
val = f.substr(pos + 27, pos2 - pos - 27);
val2 = f.substr(pos2 + 1, pos3 - pos2 - 1);
}
else if (std::wstring::npos != (pos = f.find(L"cell-content-is-between(")))
{
pFind->second->operator_ = L"between";
size_t pos2 = f.find(L",", pos + 24);
size_t pos3 = f.rfind(L")");
val = f.substr(pos + 24, pos2 - pos - 24);
val2 = f.substr(pos2 + 1, pos3 - pos2 - 1);
}
pFind->second->formula1 = converter.convert(val);
pFind->second->formula2 = converter.convert(val2);
}
}
}

View File

@ -46,8 +46,8 @@ public:
void add(const std::wstring & name, /*int col, int row*/const std::wstring & ref);
void add_formula(const std::wstring & name, const std::wstring & f);
void add_help_msg(const std::wstring & name, bool val);
void add_error_msg(const std::wstring & name, bool val);
void add_help_msg(const std::wstring & name, const std::wstring & title, const std::wstring & content, bool display);
void add_error_msg(const std::wstring & name, const std::wstring & title, const std::wstring & content, bool display);
void activate(const std::wstring & name, int col, int row/*const std::wstring & ref*/);

View File

@ -35,6 +35,30 @@
#include <xml/utils.h>
#include "../odf/datatypes/custom_shape_types_convert.h"
#include "../../formulasconvert/formulasconvert.h"
#define OBJ_Group 0x0000
#define OBJ_Line 0x0001
#define OBJ_Rectangle 0x0002
#define OBJ_Oval 0x0003
#define OBJ_Arc 0x0004
#define OBJ_Text 0x0006
#define OBJ_OfficeArt 0x001E
#define OBJ_Polygon 0x0009
#define OBJ_Picture 0x0008
#define OBJ_Chart 0x0005
#define OBJ_Button 0x0007
#define OBJ_CheckBox 0x000B
#define OBJ_RadioButton 0x000C
#define OBJ_EditBox 0x000D
#define OBJ_Label 0x000E
#define OBJ_DialogBox 0x000F
#define OBJ_SpinControl 0x0010
#define OBJ_Scrollbar 0x0011
#define OBJ_List 0x0012
#define OBJ_GroupBox 0x0013
#define OBJ_DropdownList 0x0014
#define OBJ_Note 0x0019
namespace cpdoccore {
namespace oox {
@ -48,17 +72,17 @@ std::wostream & operator << (std::wostream & strm, xlsx_drawing_position::type_t
}
}
void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_text(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
_CP_OPT(std::wstring) strTextContent;
odf_reader::GetProperty ( val.additional ,L"text-content", strTextContent);
odf_reader::GetProperty ( val.additional, L"text-content", strTextContent);
if (!strTextContent)return;
if (strTextContent->empty())return;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:txBody")
CP_XML_NODE(ns + L":txBody")
{
val.serialize_bodyPr(CP_XML_STREAM());
@ -71,28 +95,34 @@ void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val)
}
}
void xlsx_drawing_position::serialize(std::wostream & strm, std::wstring ns)
std::wstring xlsx_drawing_position::vml_serialize()
{
//emu -> pt = 1 / 12700 = 72.0 / (360000.0 * 2.54);
return std::to_wstring(position.col) + L"," + std::to_wstring((int)(position.colOff / 12700)) + L"," +
std::to_wstring(position.row) + L"," + std::to_wstring((int)(position.rowOff / 12700));
}
void xlsx_drawing_position::serialize(std::wostream & strm, const std::wstring & ns_title, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE( ns + (type == xlsx_drawing_position::from ? L"from" : L"to") )
CP_XML_NODE( ns_title + (ns_title.empty() ? L"" : L":") + (type == xlsx_drawing_position::from ? L"from" : L"to") )
{
CP_XML_NODE(L"xdr:col")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"col")
{
CP_XML_CONTENT(position.col);
}
CP_XML_NODE(L"xdr:colOff")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"colOff")
{
CP_XML_CONTENT(static_cast<size_t>(position.colOff));
}
CP_XML_NODE(L"xdr:row")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"row")
{
CP_XML_CONTENT(position.row);
}
CP_XML_NODE(L"xdr:rowOff")
CP_XML_NODE(ns + (ns.empty() ? L"" : L":") + L"rowOff")
{
CP_XML_CONTENT(static_cast<size_t>(position.rowOff));
}
@ -100,23 +130,25 @@ void xlsx_drawing_position::serialize(std::wostream & strm, std::wstring ns)
}
}
void xlsx_serialize_image(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_image(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:pic")
CP_XML_NODE(ns + L":pic")
{
CP_XML_NODE(L"xdr:nvPicPr")
CP_XML_NODE(ns + L":nvPicPr")
{
CP_XML_NODE(L"xdr:cNvPr")
CP_XML_NODE(ns + L":cNvPr")
{
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);
}
CP_XML_NODE(L"xdr:cNvPicPr")
CP_XML_NODE(ns + L":cNvPicPr")
{
if (val.fill.bitmap->bCrop)
{
@ -128,7 +160,7 @@ void xlsx_serialize_image(std::wostream & strm, _xlsx_drawing & val)
val.fill.bitmap->name_space = L"xdr";
oox_serialize_fill(CP_XML_STREAM(), val.fill);
CP_XML_NODE(L"xdr:spPr")
CP_XML_NODE(ns + L":spPr")
{
val.serialize_xfrm(CP_XML_STREAM());
@ -139,33 +171,34 @@ void xlsx_serialize_image(std::wostream & strm, _xlsx_drawing & val)
}
oox_serialize_ln(CP_XML_STREAM(), val.additional);
}
xlsx_serialize_text(CP_XML_STREAM(), val);
xml_serialize_text(CP_XML_STREAM(), val, ns);
}
} // CP_XML_WRITER
}
void xlsx_serialize_shape(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_shape(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:sp")
CP_XML_NODE(ns + L":sp")
{
CP_XML_NODE(L"xdr:nvSpPr")
CP_XML_NODE(ns + L":nvSpPr")
{
CP_XML_NODE(L"xdr:cNvPr")
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(L"xdr:cNvSpPr")//non visual properies (собственно тока 1 там)
CP_XML_NODE(ns + L":cNvSpPr")//non visual properies (собственно тока 1 там)
{
if (val.sub_type == 1)CP_XML_ATTR(L"txBox", 1);
}
} // xdr:nv_Pr
CP_XML_NODE(L"xdr:spPr")
CP_XML_NODE(ns + L":spPr")
{
val.serialize_xfrm(CP_XML_STREAM());
@ -174,11 +207,11 @@ void xlsx_serialize_shape(std::wostream & strm, _xlsx_drawing & val)
oox_serialize_ln(CP_XML_STREAM(),val.additional, val.lined);
} // xdr:spPr
xlsx_serialize_text(CP_XML_STREAM(), val);
xml_serialize_text(CP_XML_STREAM(), val, ns);
}
} // CP_XML_WRITER
}
void xlsx_serialize_object(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_object(std::wostream & strm, _xlsx_drawing & val)
{//отображательная часть
CP_XML_WRITER(strm)
{
@ -190,7 +223,24 @@ void xlsx_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");
}
@ -206,22 +256,24 @@ void xlsx_serialize_object(std::wostream & strm, _xlsx_drawing & val)
}
}
}
void xlsx_serialize_group(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_group(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:grpSp")
CP_XML_NODE(ns + L":grpSp")
{
CP_XML_NODE(L"xdr:nvGrpSpPr")
CP_XML_NODE(ns + L":nvGrpSpPr")
{
CP_XML_NODE(L"xdr:cNvPr")
CP_XML_NODE(ns + L":cNvPr")
{
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
}
CP_XML_NODE(L"xdr:cNvGrpSpPr");
if (val.hidden) CP_XML_ATTR(L"hidden", 1);
}
CP_XML_NODE(ns + L":cNvGrpSpPr");
}
CP_XML_NODE(L"xdr:grpSpPr")
CP_XML_NODE(ns + L":grpSpPr")
{
val.serialize_xfrm(CP_XML_STREAM());
@ -231,7 +283,7 @@ void xlsx_serialize_group(std::wostream & strm, _xlsx_drawing & val)
}
}
void xlsx_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
{//отображательная часть
CP_XML_WRITER(strm)
{
@ -243,7 +295,9 @@ void xlsx_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");
}
@ -266,75 +320,106 @@ void xlsx_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
}
}
}
void xlsx_serialize(std::wostream & strm, _xlsx_drawing & val)
void xml_serialize(std::wostream & strm, _xlsx_drawing & val, const std::wstring & ns)
{
if (val.type == typeShape)
{
xlsx_serialize_shape(strm, val);
xml_serialize_shape(strm, val, ns);
}
else if (val.type == typeImage)
{
xlsx_serialize_image(strm, val);
xml_serialize_image(strm, val, ns);
}
else if (val.type == typeChart)
{
xlsx_serialize_chart(strm, val);
xml_serialize_chart(strm, val);
}
else if (val.type == typeGroupShape)
{
xlsx_serialize_group(strm, val);
xml_serialize_group(strm, val, ns);
}
else if (val.type == typeOleObject ||
val.type == typeMsObject ||
val.type == typeControl)
{
xlsx_serialize_object(strm, val);
xml_serialize_object(strm, val);
}
}
void _xlsx_drawing::serialize(std::wostream & strm)
void _xlsx_drawing::serialize(std::wostream & strm, const std::wstring & ns)
{
if (inGroup)
return xlsx_serialize(strm, *this);
return xml_serialize(strm, *this, ns);
CP_XML_WRITER(strm)
{
if (type_anchor == 1)
{
CP_XML_NODE(L"xdr:twoCellAnchor")
CP_XML_NODE(ns + L":twoCellAnchor")
{
CP_XML_ATTR(L"editAs", L"oneCell");//"absolute");oneCell
from_.serialize (CP_XML_STREAM());
to_.serialize (CP_XML_STREAM());
xlsx_serialize (CP_XML_STREAM(), *this);
CP_XML_NODE(L"xdr:clientData");
xml_serialize (CP_XML_STREAM(), *this, ns);
CP_XML_NODE(ns + L":clientData");
}
}
else
else if (type_anchor == 2)
{
CP_XML_NODE(L"xdr:absoluteAnchor")
CP_XML_NODE(ns + L":absoluteAnchor")
{
CP_XML_NODE(L"xdr:pos")
CP_XML_NODE(ns + L":pos")
{
CP_XML_ATTR(L"x", x);
CP_XML_ATTR(L"y", y);
}
CP_XML_NODE(L"xdr:ext")
CP_XML_NODE(ns + L":ext")
{
CP_XML_ATTR(L"cx", cx);
CP_XML_ATTR(L"cy", cy);
}
xlsx_serialize(CP_XML_STREAM(), *this);
CP_XML_NODE(L"xdr:clientData");
xml_serialize(CP_XML_STREAM(), *this, ns);
CP_XML_NODE(ns + L":clientData");
}
}
else if (type_anchor == 3)
{
CP_XML_NODE(ns + L":relSizeAnchor")
{
CP_XML_NODE(ns + L":from")
{
CP_XML_NODE(ns + L":x")
{
CP_XML_STREAM() << ((double)x / *owner_cx_);
}
CP_XML_NODE(ns + L":y")
{
CP_XML_STREAM() << ((double)y / *owner_cy_);
}
}
CP_XML_NODE(ns + L":to")
{
_INT32 x1 = x + cx;
_INT32 y1 = y + cy;
CP_XML_NODE(ns + L":x")
{
CP_XML_STREAM() << ((double)x1 / *owner_cx_);
}
CP_XML_NODE(ns + L":y")
{
CP_XML_STREAM() << ((double)y1 / *owner_cy_);
}
}
xml_serialize(CP_XML_STREAM(), *this, ns);
}
}
}
}
void _xlsx_drawing::serialize_object (std::wostream & strm)
{
if (type != typeOleObject && type != typeMsObject) return;
@ -358,9 +443,8 @@ void _xlsx_drawing::serialize_object (std::wostream & strm)
{
CP_XML_ATTR(L"moveWithCells", 1);
from_.serialize (CP_XML_STREAM(), L"");
to_.serialize (CP_XML_STREAM(), L"");
from_.serialize (CP_XML_STREAM(), L"", L"");
to_.serialize (CP_XML_STREAM(), L"", L"");
}
}
}
@ -390,14 +474,186 @@ void _xlsx_drawing::serialize_control (std::wostream & strm)
{
CP_XML_ATTR(L"moveWithCells", 1);
from_.serialize (CP_XML_STREAM(), L"");
to_.serialize (CP_XML_STREAM(), L"");
from_.serialize (CP_XML_STREAM(), L"", L"xdr");
to_.serialize (CP_XML_STREAM(), L"", L"xdr");
}
}
}
}
}
void _xlsx_drawing::serialize_vml(std::wostream & strm)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"v:shape")
{
CP_XML_ATTR(L"id", L"_x0000_s" + std::to_wstring(id));
CP_XML_ATTR(L"type", sub_type == OBJ_Note ? L"#_x0000_t202" : L"#_x0000_t201");
std::wstring color;
if (fill.solid)
color = fill.solid->color;
if (!color.empty())
CP_XML_ATTR(L"fillcolor", L"#" + color);
CP_XML_ATTR(L"stroked", /*lined ? */L"t"/* : L"f"*/);
std::wstring style = L"position:absolute";
//style +="margin-left:414.3pt;margin-top:70.2pt;width:144.15pt;height:96.75pt";
CP_XML_ATTR(L"style", style);
CP_XML_NODE(L"v:shadow")
{
CP_XML_ATTR(L"on", L"t");
CP_XML_ATTR(L"obscured", L"t");
CP_XML_ATTR(L"color", L"black");
}
//CP_XML_NODE(L"w10:wrap")
//{
// CP_XML_ATTR(L"type", L"none");
//}
vml_serialize_fill(CP_XML_STREAM(), fill);
vml_serialize_ln(CP_XML_STREAM(), additional);
vml_serialize_text(CP_XML_STREAM(), additional);
CP_XML_NODE(L"x:ClientData")
{
switch(sub_type)
{
case OBJ_Button: CP_XML_ATTR(L"ObjectType", L"Button"); break;
case OBJ_CheckBox: CP_XML_ATTR(L"ObjectType", L"Checkbox");break;
case OBJ_RadioButton: CP_XML_ATTR(L"ObjectType", L"Radio"); break;
case OBJ_EditBox: CP_XML_ATTR(L"ObjectType", L"Edit"); break;
case OBJ_Label: CP_XML_ATTR(L"ObjectType", L"Label"); break;
case OBJ_DialogBox: CP_XML_ATTR(L"ObjectType", L"Dialog"); break;
case OBJ_SpinControl: CP_XML_ATTR(L"ObjectType", L"Spin"); break;
case OBJ_Scrollbar: CP_XML_ATTR(L"ObjectType", L"Scroll"); break;
case OBJ_List: CP_XML_ATTR(L"ObjectType", L"List"); break;
case OBJ_DropdownList: CP_XML_ATTR(L"ObjectType", L"List"); break;
case OBJ_Note: CP_XML_ATTR(L"ObjectType", L"Note"); break;
}
CP_XML_NODE(L"x:MoveWithCells");
CP_XML_NODE(L"x:SizeWithCells");
CP_XML_NODE(L"x:Anchor")
{
CP_XML_STREAM() << from_.vml_serialize() << L"," << to_.vml_serialize();
}
CP_XML_NODE(L"x:AutoFill")
{
CP_XML_STREAM() << L"False";
}
_CP_OPT(int) base_col, base_row;
GetProperty(additional, L"base_col", base_col);
GetProperty(additional, L"base_row", base_row);
if (base_row)
{
CP_XML_NODE(L"x:Row")
{
CP_XML_STREAM() << *base_row;
}
}
if (base_col)
{
CP_XML_NODE(L"x:Column")
{
CP_XML_STREAM() << *base_col;
}
}
_CP_OPT(std::wstring) sVal;
GetProperty(additional, L"linked_cell", sVal);
if (sVal)
{
formulasconvert::odf2oox_converter converter;
std::wstring fmla = converter.convert_named_ref(*sVal);
CP_XML_NODE(L"x:FmlaLink")
{
CP_XML_STREAM() << fmla;
}
}
GetProperty(additional, L"cell_range", sVal);
if (sVal)
{
formulasconvert::odf2oox_converter converter;
std::wstring fmla = converter.convert_named_ref(*sVal);
CP_XML_NODE(L"x:FmlaRange")
{
CP_XML_STREAM() << fmla;
}
}
_CP_OPT(bool) visible;
GetProperty(additional, L"visible", visible);
if (visible)
{
if (*visible == false)
{
CP_XML_NODE(L"x:Visible")
{
CP_XML_STREAM() << L"False";
}
}
else
CP_XML_NODE(L"x:Visible");
}
_CP_OPT(int) nVal;
GetProperty(additional, L"min_value", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Min")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"max_value", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Max")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"step", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Inc")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"page_step", nVal);
if (nVal)
{
CP_XML_NODE(L"x:Page")
{
CP_XML_STREAM() << *nVal;
}
}
GetProperty(additional, L"value", sVal);
if (sVal)
{
CP_XML_NODE(L"x:Val")
{
CP_XML_STREAM() << *sVal;
}
}
GetProperty(additional, L"orientation", sVal);
if (sVal)
{
if (*sVal == L"horizontal") CP_XML_NODE(L"x:Horiz");
else CP_XML_NODE(L"x:Vert");
}
}
}
}
}
}

View File

@ -49,10 +49,10 @@ struct xlsx_drawing_position
enum type_t {from, to} type;
xlsx_table_position position;
void serialize(std::wostream & _Wostream, std::wstring ns = L"xdr:");
void serialize(std::wostream & _Wostream, const std::wstring & ns_title = L"xdr", const std::wstring & ns = L"xdr");
std::wstring vml_serialize();
};
class _xlsx_drawing : public _oox_drawing
{
public:
@ -63,9 +63,15 @@ public:
xlsx_drawing_position from_;
xlsx_drawing_position to_;
_CP_OPT(_INT32) owner_cx_;
_CP_OPT(_INT32) owner_cy_;
std::wstring content_group_;
void serialize (std::wostream & strm);
virtual void serialize (std::wostream & strm) {return serialize(strm, L"xdr");}
void serialize (std::wostream & strm, const std::wstring & ns);
void serialize_vml (std::wostream & strm);
void serialize_object (std::wostream & strm);
void serialize_control (std::wostream & strm);
};

View File

@ -53,41 +53,54 @@ namespace oox {
class xlsx_drawing_context_handle::Impl
{
public:
Impl(mediaitems & items) : items_(items), next_rId_(1), next_drawing_id_(1)
Impl(mediaitems_ptr & items) : items_(items), next_drawing_id_(1), next_vml_drawing_id_(1)
{
}
mediaitems & get_mediaitems() { return items_; }
mediaitems_ptr & get_mediaitems() { return items_; }
size_t next_rId()
std::pair<std::wstring, std::wstring> add_drawing_vml(std::wstring const & content, xlsx_drawings_ptr drawings)
{
return next_rId_++;
const std::wstring id = std::to_wstring(next_vml_drawing_id_++);
const std::wstring fileName = std::wstring(L"vmlDrawing") + id + L".vml";
drawings_vml_.push_back(drawing_elm(fileName, content, drawings, typeDefault));
const std::wstring rId = std::wstring(L"rVId") + id;
return std::pair<std::wstring, std::wstring>(fileName, rId);
}
std::pair<std::wstring, std::wstring> add_drawing_xml(std::wstring const & content, xlsx_drawings_ptr drawings)
std::pair<std::wstring, std::wstring> add_drawing_xml(std::wstring const & content, xlsx_drawings_ptr drawings, RelsType const & type_)
{
const std::wstring id = std::to_wstring(next_drawing_id_++);
const std::wstring fileName = std::wstring(L"drawing") + id + L".xml";
drawings_.push_back(drawing_elm(fileName, content, drawings));
const std::wstring rId = std::wstring(L"rId") + id;//rDrId
return std::pair<std::wstring, std::wstring>(fileName, rId);
}
const std::vector<drawing_elm> & content() const
{
return drawings_;
drawings_.push_back(drawing_elm(fileName, content, drawings, type_));
const std::wstring rId = std::wstring(L"rDrId") + id;
return std::pair<std::wstring, std::wstring>(fileName, rId);
}
const std::vector<drawing_elm> & content() const
{
return drawings_;
}
const std::vector<drawing_elm> & content_vml() const
{
return drawings_vml_;
}
private:
mediaitems & items_;
std::vector<drawing_elm> drawings_;
mediaitems_ptr items_;
std::vector<drawing_elm> drawings_;
std::vector<drawing_elm> drawings_vml_;
size_t next_rId_;
size_t next_drawing_id_;
size_t next_vml_drawing_id_;
};
xlsx_drawing_context_handle::xlsx_drawing_context_handle(mediaitems & items)
: impl_(new xlsx_drawing_context_handle::Impl(items))
xlsx_drawing_context_handle::xlsx_drawing_context_handle(mediaitems_ptr & items) :
next_rId_(1024), impl_(new xlsx_drawing_context_handle::Impl(items))
{
}
@ -95,26 +108,33 @@ xlsx_drawing_context_handle::~xlsx_drawing_context_handle()
{
}
std::pair<std::wstring, std::wstring> xlsx_drawing_context_handle::add_drawing_xml(std::wstring const & content, xlsx_drawings_ptr drawings)
std::pair<std::wstring, std::wstring> xlsx_drawing_context_handle::add_drawing_xml(std::wstring const & content, xlsx_drawings_ptr drawings, RelsType const & type_)
{
return impl_->add_drawing_xml(content, drawings);
return impl_->add_drawing_xml(content, drawings, type_);
}
std::pair<std::wstring, std::wstring> xlsx_drawing_context_handle::add_drawing_vml(std::wstring const & content, xlsx_drawings_ptr drawings)
{
return impl_->add_drawing_vml(content, drawings);
}
const std::vector<drawing_elm> & xlsx_drawing_context_handle::content() const
{
return impl_->content();
}
const std::vector<drawing_elm> & xlsx_drawing_context_handle::content_vml() const
{
return impl_->content_vml();
}
class xlsx_drawing_context::Impl
{
public:
Impl(xlsx_drawing_context_handle & handle) : xlsx_drawings_(xlsx_drawings::create(false)), handle_(handle)
Impl(xlsx_drawing_context_handle_ptr & handle) : xlsx_drawings_(xlsx_drawings::create(false)), handle_(handle)
{
current_level_ = &objects_;
use_image_replacement_ = false;
}
xlsx_drawing_context_handle& handle_;
xlsx_drawing_context_handle_ptr handle_;
drawing_object_description object_description_;
std::vector<drawing_object_description> objects_;
@ -124,21 +144,27 @@ public:
bool use_image_replacement_;
//-----------------------------------------------------------------------------------
mediaitems & get_mediaitems() { return handle_.impl_->get_mediaitems(); }
mediaitems_ptr & get_mediaitems() { return handle_->impl_->get_mediaitems(); }
void serialize(std::wostream & strm)
void serialize(std::wostream & strm, const std::wstring & ns = L"xdr")
{
xlsx_drawings_->serialize(strm);
xlsx_drawings_->serialize(strm, ns);
}
void serialize_vml(std::wostream & strm)
{
xlsx_drawings_->serialize_vml(strm);
}
bool empty() const
{
return xlsx_drawings_->empty();
}
bool vml_empty() const
{
return xlsx_drawings_->vml_empty();
}
size_t next_rId()
{
return handle_.impl_->next_rId();
return handle_->next_rId();
}
xlsx_drawings_ptr get_drawings()
@ -150,7 +176,7 @@ private:
};
xlsx_drawing_context::xlsx_drawing_context(xlsx_drawing_context_handle & h)
xlsx_drawing_context::xlsx_drawing_context(xlsx_drawing_context_handle_ptr & h)
: impl_(new xlsx_drawing_context::Impl(h))
{
hlinks_size_ = 0;
@ -281,7 +307,29 @@ void xlsx_drawing_context::end_shape()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::start_comment(int base_col, int base_row)
{
impl_->object_description_.type_ = typeComment;
impl_->object_description_.shape_type_ = 0x0019; // OBJ_Note object type for vml
set_property(odf_reader::_property(L"base_col", base_col));
set_property(odf_reader::_property(L"base_row", base_row));
}
void xlsx_drawing_context::end_comment()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::start_control(const std::wstring & ctrlPropId, int type)
{
impl_->object_description_.type_ = typeControl;
impl_->object_description_.shape_type_ = type; // object type for vml
impl_->object_description_.xlink_href_ = ctrlPropId;
}
void xlsx_drawing_context::end_control()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::set_use_image_replacement()
{
impl_->use_image_replacement_ = true;
@ -304,11 +352,6 @@ void xlsx_drawing_context::set_ms_object(const std::wstring & path, const std::w
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void xlsx_drawing_context::set_control(const std::wstring & ctrlPropId)
{
impl_->object_description_.type_ = typeControl;
impl_->object_description_.xlink_href_ = ctrlPropId;
}
void xlsx_drawing_context::set_image(const std::wstring & path)
{
int pos_replaicement = path.find(L"ObjectReplacements");
@ -386,6 +429,12 @@ void xlsx_drawing_context::set_scale(double cx_pt, double cy_pt)
}
}
void xlsx_drawing_context::set_rel_anchor(_INT32 owner_cx, _INT32 owner_cy)
{
impl_->object_description_.owner_cx_ = owner_cx;
impl_->object_description_.owner_cy_ = owner_cy;
}
void xlsx_drawing_context::set_anchor(std::wstring anchor, double x_pt, double y_pt, bool group)
{
if (group)
@ -439,14 +488,25 @@ bool xlsx_drawing_context::empty() const
{
return impl_->empty();
}
bool xlsx_drawing_context::vml_empty() const
{
return impl_->vml_empty();
}
void xlsx_drawing_context::process_common_properties(drawing_object_description & obj, _xlsx_drawing & drawing, xlsx_table_metrics & table_metrics)
{
if (obj.anchor_.empty())
{
drawing.type_anchor = 2; // absolute
if (obj.owner_cx_ && obj.owner_cy_)
{
drawing.type_anchor = 3; // relative
drawing.owner_cx_ = obj.owner_cx_;
drawing.owner_cy_ = obj.owner_cy_;
}
else
drawing.type_anchor = 2; // absolute
}
else
if (drawing.type_anchor == 1)
{
xlsx_table_position from, to;
@ -470,17 +530,19 @@ void xlsx_drawing_context::process_common_properties(drawing_object_description
_rect & r = obj.svg_rect_.get();
//todooo непонятно что делать с отрицательными значениями
int val = 0.5 + odf_types::length(obj.svg_rect_->x, odf_types::length::pt).get_value_unit(odf_types::length::emu);
if (val >=0) drawing.x = val;
_INT32 val = 0;
val = (_INT32) (0.5 + odf_types::length(obj.svg_rect_->x, odf_types::length::pt).get_value_unit(odf_types::length::emu));
if (val >= 0) drawing.x = val;
val = 0.5 + odf_types::length(obj.svg_rect_->y, odf_types::length::pt).get_value_unit(odf_types::length::emu);
if (val >=0) drawing.y = val;
val = (_INT32) (0.5 + odf_types::length(obj.svg_rect_->y, odf_types::length::pt).get_value_unit(odf_types::length::emu));
if (val >= 0) drawing.y = val;
val = 0.5 + odf_types::length(obj.svg_rect_->cx, odf_types::length::pt).get_value_unit(odf_types::length::emu);
if (val >=0) drawing.cx = val;
val = (_INT32) (0.5 + odf_types::length(obj.svg_rect_->cx, odf_types::length::pt).get_value_unit(odf_types::length::emu));
if (val >= 0) drawing.cx = val;
val = .5 + odf_types::length(obj.svg_rect_->cy, odf_types::length::pt).get_value_unit(odf_types::length::emu);
if (val >=0) drawing.cy = val;
val = (_INT32) (0.5 + odf_types::length(obj.svg_rect_->cy, odf_types::length::pt).get_value_unit(odf_types::length::emu));
if (val >= 0) drawing.cy = val;
}
drawing.additional = obj.additional_;
@ -555,7 +617,7 @@ void xlsx_drawing_context::process_image(drawing_object_description & obj, _xlsx
}
std::wstring fileName = odf_packet_path_ + FILE_SEPARATOR_STR + obj.xlink_href_;
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, fileName, drawing.fill.bitmap->cropRect, impl_->get_mediaitems().applicationFonts());
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, fileName, drawing.fill.bitmap->cropRect, impl_->get_mediaitems()->applicationFonts());
drawing.fill.bitmap->bStretch = true;
if ((sColorMode) && (*sColorMode == L"greyscale"))
@ -564,14 +626,14 @@ void xlsx_drawing_context::process_image(drawing_object_description & obj, _xlsx
std::wstring ref;/// это ссылка на выходной внешний объект
bool isMediaInternal = false;
drawing.fill.bitmap->rId = impl_->get_mediaitems().add_or_find(obj.xlink_href_, typeImage, isMediaInternal, ref);
drawing.fill.bitmap->rId = impl_->get_mediaitems()->add_or_find(obj.xlink_href_, typeImage, isMediaInternal, ref);
if (drawing.type == typeShape)
{
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);//собственно это не объект, а доп рел и ref объекта
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage, false, false);//собственно это не объект, а доп рел и ref объекта
isMediaInternal=true;
std::wstring rId = impl_->get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
std::wstring rId = impl_->get_mediaitems()->add_or_find(L"", typeShape, isMediaInternal, ref);
xlsx_drawings_->add(drawing, isMediaInternal, rId, ref, typeShape);//объект
@ -580,7 +642,7 @@ void xlsx_drawing_context::process_image(drawing_object_description & obj, _xlsx
xlsx_drawings_->add(drawing, isMediaInternal, drawing.fill.bitmap->rId , ref, typeImage);//объект
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, obj.type_); // не объект
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, obj.type_, false, false); // не объект
}
}
@ -589,12 +651,13 @@ void xlsx_drawing_context::process_chart(drawing_object_description & obj,_xlsx_
std::wstring ref;
bool isMediaInternal = true;
drawing.objectId = impl_->get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectId = impl_->get_mediaitems()->add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_);
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_); // не объект
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_, false, false); // не объект
}
void xlsx_drawing_context::process_object(drawing_object_description & obj, xlsx_table_metrics & table_metrics, _xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_)
{
std::wstring ref;
@ -620,28 +683,29 @@ void xlsx_drawing_context::process_object(drawing_object_description & obj, xlsx
drawing.to_.position.rowOff = static_cast<size_t>(odf_types::length(to.rowOff, odf_types::length::pt).get_value_unit(odf_types::length::emu));
}
if (obj.type_ == typeControl)
if (obj.type_ == typeControl || obj.type_ == typeComment)
{
drawing.objectId = obj.xlink_href_;
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_);
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_, false);
}
else
{
drawing.objectId = impl_->get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectId = impl_->get_mediaitems()->add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectProgId = obj.descriptor_;
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_, true);
}
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_); // не объект
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_, false, false); // не объект
}
void xlsx_drawing_context::process_shape(drawing_object_description & obj,_xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_)
{
std::wstring ref;
bool isMediaInternal = true;
std::wstring rId = impl_->get_mediaitems().add_or_find(L"", obj.type_, isMediaInternal, ref);
std::wstring rId = impl_->get_mediaitems()->add_or_find(L"", obj.type_, isMediaInternal, ref);
xlsx_drawings_->add(drawing, isMediaInternal, rId, ref, obj.type_);
}
@ -653,7 +717,7 @@ void xlsx_drawing_context::process_group(drawing_object_description & obj, xlsx_
std::wstringstream strm;
xlsx_drawings_child->serialize(strm);
xlsx_drawings_child->serialize(strm, L"xdr");
drawing.content_group_ = strm.str();
@ -661,7 +725,7 @@ void xlsx_drawing_context::process_group(drawing_object_description & obj, xlsx_
std::wstring ref;
bool isMediaInternal = true;
std::wstring rId = impl_->get_mediaitems().add_or_find(L"", obj.type_, isMediaInternal, ref);
std::wstring rId = impl_->get_mediaitems()->add_or_find(L"", obj.type_, isMediaInternal, ref);
xlsx_drawings_->add(drawing, isMediaInternal, rId, ref, obj.type_);
}
@ -685,17 +749,17 @@ void xlsx_drawing_context::process_group_objects(std::vector<drawing_object_desc
drawing.lined = obj.lined_;
drawing.connector = obj.connector_;
drawing.sub_type = obj.shape_type_;
drawing.sub_type = obj.shape_type_;
if (drawing.fill.bitmap)
{
std::wstring ref;
bool isMediaInternal = true;
drawing.fill.bitmap->rId = impl_->get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
drawing.fill.bitmap->rId = impl_->get_mediaitems()->add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
bool in_sheet = (obj.type_== typeOleObject || obj.type_== typeMsObject) ? true : false;
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage, in_sheet);//собственно это не объект, а доп рел и ref объекта
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage, in_sheet, false);//собственно это не объект, а доп рел и ref объекта
//object dumps in sheet rels !!
}
@ -710,15 +774,19 @@ void xlsx_drawing_context::process_group_objects(std::vector<drawing_object_desc
case typeGroupShape: process_group ( obj, table_metrics, drawing, xlsx_drawings_); break;
case typeMsObject:
case typeOleObject:
case typeControl:
process_object ( obj, table_metrics, drawing, xlsx_drawings_); break;
case typeControl:
case typeComment: process_object ( obj, table_metrics, drawing, xlsx_drawings_); break;
}
}
}
void xlsx_drawing_context::serialize(std::wostream & strm)
void xlsx_drawing_context::serialize(std::wostream & strm, const std::wstring& ns)
{
impl_->serialize(strm);
impl_->serialize(strm, ns);
}
void xlsx_drawing_context::serialize_vml(std::wostream & strm)
{
impl_->serialize_vml(strm);
}
xlsx_drawings_ptr xlsx_drawing_context::get_drawings()
@ -756,6 +824,5 @@ void xlsx_drawing_context::set_is_connector_shape(bool val)
impl_->object_description_.connector_ = val;
}
}
}

View File

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

View File

@ -44,20 +44,35 @@ 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 )//объект
{
xlsx_drawings_.push_back(d);
add (isInternal, rid, ref, type, sheet_rel);
for (size_t i = 0; i < d.hlinks.size(); i++)
{
xlsx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink));
if ( type == 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);
add (isInternal, rid, ref, type, sheet_rel, false);
for (size_t i = 0; i < d.hlinks.size(); i++)
{
drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink));
}
if (!d.action.hId.empty())
drawing_rels_.push_back(_rel(false, d.action.hId, d.action.hRef, d.action.typeRels));
}
if (!d.action.hId.empty())
xlsx_drawing_rels_.push_back(_rel(false, d.action.hId, d.action.hRef, d.action.typeRels));
}
void add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel) //не объект
void add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel, bool vml_rel) //не объект
{
bool present = false;
@ -73,40 +88,125 @@ public:
if (!present)
xlsx_sheet_rels_.push_back (_rel(isInternal, rid, ref, type));
}
else
else if (vml_rel)
{
for (size_t i = 0 ; i < xlsx_drawing_rels_.size(); i++)
for (size_t i = 0 ; i < vml_drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].rid == rid && xlsx_drawing_rels_[i].ref == ref)
if (vml_drawing_rels_[i].rid == rid && vml_drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
xlsx_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
vml_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
else
{
for (size_t i = 0 ; i < drawing_rels_.size(); i++)
{
if (drawing_rels_[i].rid == rid && drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
}
void serialize(std::wostream & strm)
void serialize(std::wostream & strm, const std::wstring & ns)
{
if (drawings_.empty()) return;
if (inGroup)
{
for (size_t i = 0 ; i < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < drawings_.size(); i++)
{
xlsx_drawings_[i].serialize(strm);
drawings_[i].serialize(strm, ns);
}
}
else
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:wsDr")
CP_XML_NODE(ns + L":wsDr")
{
CP_XML_ATTR(L"xmlns:xdr", L"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing");
if (ns == L"xdr")
{
CP_XML_ATTR(L"xmlns:xdr", L"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing");
}
if (ns == L"cdr")
{
CP_XML_ATTR(L"xmlns:cdr", L"http://schemas.openxmlformats.org/drawingml/2006/chartDrawing");
}
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 < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < drawings_.size(); i++)
{
xlsx_drawings_[i].serialize(CP_XML_STREAM());
drawings_[i].serialize(CP_XML_STREAM(), ns);
}
}
}
}
}
void serialize_vml(std::wostream & strm)
{
if (vml_drawings_.empty()) return;
if (inGroup)
{
for (size_t i = 0 ; i < vml_drawings_.size(); i++)
{
vml_drawings_[i].serialize_vml(strm);
}
}
else
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xml")
{
CP_XML_ATTR(L"xmlns:v", L"urn:schemas-microsoft-com:vml");
CP_XML_ATTR(L"xmlns:o", L"urn:schemas-microsoft-com:office:office");
CP_XML_ATTR(L"xmlns:x", L"urn:schemas-microsoft-com:office:excel");
CP_XML_NODE(L"v:shapetype")
{
CP_XML_ATTR(L"id", L"_x0000_t201");
CP_XML_ATTR(L"o:spt", L"201"); // sptHostControl = 201
CP_XML_ATTR(L"coordsize", L"21600,21600");
CP_XML_ATTR(L"path", L"m,l,21600r21600,l21600,xe");
CP_XML_NODE(L"v:stroke")
{
CP_XML_ATTR(L"joinstyle", L"miter");
}
CP_XML_NODE(L"v:path")
{
CP_XML_ATTR(L"gradientshapeok", L"t");
CP_XML_ATTR(L"o:connecttype", L"rect");
}
}
CP_XML_NODE(L"v:shapetype")
{
CP_XML_ATTR(L"id", L"_x0000_t202");
CP_XML_ATTR(L"o:spt", L"202"); // sptTextBox = 202
CP_XML_ATTR(L"coordsize", L"21600,21600");
CP_XML_ATTR(L"path", L"m,l,21600l21600,21600l21600,xe");
CP_XML_NODE(L"v:stroke")
{
CP_XML_ATTR(L"joinstyle", L"miter");
}
CP_XML_NODE(L"v:path")
{
CP_XML_ATTR(L"gradientshapeok", L"t");
CP_XML_ATTR(L"o:connecttype", L"rect");
}
}
for (size_t i = 0 ; i < vml_drawings_.size(); i++)
{
vml_drawings_[i].serialize_vml(CP_XML_STREAM());
}
}
}
@ -114,41 +214,62 @@ public:
}
void serialize_objects(std::wostream & strm)
{
for (size_t i = 0 ; i < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < drawings_.size(); i++)
{
if (xlsx_drawings_[i].type != typeOleObject && xlsx_drawings_[i].type != typeMsObject) continue;
if (drawings_[i].type != typeOleObject && drawings_[i].type != typeMsObject) continue;
xlsx_drawings_[i].serialize_object(strm);
drawings_[i].serialize_object(strm);
}
}
void serialize_controls(std::wostream & strm)
{
for (size_t i = 0 ; i < xlsx_drawings_.size(); i++)
for (size_t i = 0 ; i < vml_drawings_.size(); i++)
{
if (xlsx_drawings_[i].type != typeControl) continue;
if (vml_drawings_[i].type != typeControl) continue;
xlsx_drawings_[i].serialize_control(strm);
vml_drawings_[i].serialize_control(strm);
}
}
bool empty() const
{
return (xlsx_drawings_.empty());
return (drawings_.empty());
}
bool vml_empty() const
{
return (vml_drawings_.empty());
}
void dump_rels_drawing(rels & Rels)
{
for (size_t i = 0 ; i < xlsx_drawing_rels_.size(); i++)
for (size_t i = 0 ; i < drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].type == typeImage ||
xlsx_drawing_rels_[i].type == typeMedia ||
xlsx_drawing_rels_[i].type == typeChart ||
xlsx_drawing_rels_[i].type == typeHyperlink )
if (drawing_rels_[i].type == typeImage ||
drawing_rels_[i].type == typeMedia ||
drawing_rels_[i].type == typeChart ||
drawing_rels_[i].type == typeHyperlink )
{
Rels.add(relationship( xlsx_drawing_rels_[i].rid,
mediaitems::get_rel_type(xlsx_drawing_rels_[i].type),
(xlsx_drawing_rels_[i].is_internal ? std::wstring(L"../") + xlsx_drawing_rels_[i].ref : xlsx_drawing_rels_[i].ref),
(xlsx_drawing_rels_[i].is_internal ? L"" : L"External")) );
Rels.add(relationship( drawing_rels_[i].rid,
mediaitems::get_rel_type(drawing_rels_[i].type),
(drawing_rels_[i].is_internal ? std::wstring(L"../") + drawing_rels_[i].ref : drawing_rels_[i].ref),
(drawing_rels_[i].is_internal ? L"" : L"External")) );
}
}
}
void dump_rels_vml_drawing(rels & Rels)
{
for (size_t i = 0 ; i < vml_drawing_rels_.size(); i++)
{
if (vml_drawing_rels_[i].type == typeImage ||
vml_drawing_rels_[i].type == typeMedia ||
vml_drawing_rels_[i].type == typeChart ||
vml_drawing_rels_[i].type == typeHyperlink )
{
Rels.add(relationship( vml_drawing_rels_[i].rid,
mediaitems::get_rel_type(vml_drawing_rels_[i].type),
(vml_drawing_rels_[i].is_internal ? std::wstring(L"../") + vml_drawing_rels_[i].ref : vml_drawing_rels_[i].ref),
(vml_drawing_rels_[i].is_internal ? L"" : L"External")) );
}
}
}
@ -166,9 +287,11 @@ public:
private:
std::vector<_xlsx_drawing> xlsx_drawings_;
std::vector<_xlsx_drawing> drawings_;
std::vector<_xlsx_drawing> vml_drawings_;
std::vector<_rel> xlsx_drawing_rels_;
std::vector<_rel> drawing_rels_;
std::vector<_rel> vml_drawing_rels_;
std::vector<_rel> xlsx_sheet_rels_;
};
@ -181,20 +304,24 @@ 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);
}
void xlsx_drawings::add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel)
void xlsx_drawings::add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel, bool vml_rel)
{
impl_->add(isInternal, rid, ref, type, sheet_rel);
impl_->add(isInternal, rid, ref, type, sheet_rel, vml_rel);
}
void xlsx_drawings::serialize(std::wostream & strm)
void xlsx_drawings::serialize(std::wostream & strm, const std::wstring & ns)
{
impl_->serialize(strm);
impl_->serialize(strm, ns);
}
void xlsx_drawings::serialize_vml(std::wostream & strm)
{
impl_->serialize_vml(strm);
}
void xlsx_drawings::serialize_objects(std::wostream & strm)
@ -210,12 +337,18 @@ bool xlsx_drawings::empty() const
{
return impl_->empty();
}
bool xlsx_drawings::vml_empty() const
{
return impl_->vml_empty();
}
void xlsx_drawings::dump_rels_drawing(rels & Rels)
{
return impl_->dump_rels_drawing(Rels);
}
void xlsx_drawings::dump_rels_vml_drawing(rels & Rels)
{
return impl_->dump_rels_vml_drawing(Rels);
}
void xlsx_drawings::dump_rels_sheet(rels & Rels)
{
return impl_->dump_rels_sheet(Rels);

View File

@ -46,13 +46,14 @@ typedef _CP_PTR(xlsx_drawings) xlsx_drawings_ptr;
struct drawing_elm
{
drawing_elm(std::wstring const & _filename, std::wstring const & _content, xlsx_drawings_ptr _drawings)
: filename(_filename), content(_content), drawings(_drawings)
drawing_elm(std::wstring const & _filename, std::wstring const & _content, xlsx_drawings_ptr _drawings, RelsType const & _type)
: filename(_filename), content(_content), drawings(_drawings), type(_type)
{}
std::wstring filename;
std::wstring content;
xlsx_drawings_ptr drawings;
RelsType type;
};
class _xlsx_drawing;
@ -64,14 +65,18 @@ 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 = false );
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;
void dump_rels_sheet (rels & Rels);
void dump_rels_drawing (rels & Rels);
bool empty() const;
bool vml_empty() const;
void dump_rels_sheet (rels & Rels);
void dump_rels_drawing (rels & Rels);
void dump_rels_vml_drawing (rels & Rels);
void serialize (std::wostream & _Wostream);
void serialize (std::wostream & _Wostream, const std::wstring & ns);
void serialize_vml (std::wostream & _Wostream);
void serialize_objects (std::wostream & _Wostream);
void serialize_controls (std::wostream & _Wostream);
private:

View File

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

View File

@ -58,7 +58,6 @@ public:
std::wostream & sheetData();
std::wostream & hyperlinks();
std::wostream & mergeCells();
std::wostream & drawing();
std::wostream & comments();
std::wostream & autofilter();
std::wostream & tableParts();
@ -68,6 +67,7 @@ public:
std::wostream & sort();
std::wostream & ole_objects();
std::wostream & page_properties();
std::wostream & header_footer();
std::wostream & controls();
std::wostream & protection();

View File

@ -31,6 +31,8 @@
*/
#include "xlsx_package.h"
#include "docx_package.h"
#include "pptx_package.h"
#include <boost/ref.hpp>
@ -298,16 +300,16 @@ void xl_files::add_sheet(sheet_content_ptr sheet)
sheets_files_.add_sheet(sheet);
}
void xl_files::set_media(mediaitems & _Mediaitems)
void xl_files::set_media(mediaitems_ptr & _mediaitems)
{
if (_Mediaitems.count_image + _Mediaitems.count_media > 0)
if (_mediaitems->count_image + _mediaitems->count_media > 0)
{
media_ = element_ptr( new media(_Mediaitems, _Mediaitems.applicationFonts()) );
media_ = element_ptr( new media(_mediaitems, _mediaitems->applicationFonts()) );
}
if (_Mediaitems.count_object > 0)
if (_mediaitems->count_object > 0)
{
embeddings_ = element_ptr( new embeddings(_Mediaitems) );
embeddings_ = element_ptr( new embeddings(_mediaitems) );
}
}
void xl_files::set_comments(element_ptr Element)
@ -556,17 +558,27 @@ void xl_control_props_files::write(const std::wstring & RootPath)
}
}
//------------------------------------------------------------------------------------------------------
xl_drawings_ptr xl_drawings::create(const std::vector<drawing_elm> & elms)
xl_drawings_ptr xl_drawings::create(const std::vector<drawing_elm> & elms, const std::vector<drawing_elm> & vml_elms)
{
return boost::make_shared<xl_drawings>(boost::ref(elms));
return boost::make_shared<xl_drawings>(boost::ref(elms), boost::ref(vml_elms));
}
void xl_drawings::write(const std::wstring & RootPath)
{
if (drawings_.empty() && vml_drawings_.empty()) return;
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"drawings";
NSDirectory::CreateDirectory(path.c_str());
for (size_t i = 0; i < drawings_.size(); i++)
content_type * contentTypes = this->get_main_document()->get_content_types_file().content();
pptx_document *pptx = dynamic_cast<pptx_document*>(this->get_main_document());
xlsx_document *xlsx = dynamic_cast<xlsx_document*>(this->get_main_document());
docx_document *docx = dynamic_cast<docx_document*>(this->get_main_document());
const std::wstring override_str = docx ? L"/word/drawings/" : (pptx ? L"/ppt/drawings/" : L"/xl/drawings/");
for (size_t i = 0; i < drawings_.size(); i++)
{
package::simple_element(drawings_[i].filename, drawings_[i].content).write(path);
@ -578,10 +590,25 @@ void xl_drawings::write(const std::wstring & RootPath)
relFiles.add_rel_file(r);
relFiles.write(path);
content_type * contentTypes = this->get_main_document()->get_content_types_file().content();
const std::wstring kDrawingCT = drawings_[i].type == typeChartUserShapes ?
L"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" :
L"application/vnd.openxmlformats-officedocument.drawing+xml";
contentTypes->add_override(override_str + drawings_[i].filename, kDrawingCT);
}
for (size_t i = 0; i < vml_drawings_.size(); i++)
{
package::simple_element(vml_drawings_[i].filename, vml_drawings_[i].content).write(path);
const std::wstring kDrawingCT = L"application/vnd.openxmlformats-officedocument.drawing+xml";
contentTypes->add_override(L"/xl/drawings/" + drawings_[i].filename, kDrawingCT);
rels_files relFiles;
rels_file_ptr r = rels_file::create(vml_drawings_[i].filename + L".rels");
vml_drawings_[i].drawings->dump_rels_vml_drawing(r->get_rels());
relFiles.add_rel_file(r);
relFiles.write(path);
//content types - default
}
}
@ -593,9 +620,6 @@ xl_comments_ptr xl_comments::create(const std::vector<comment_elm> & elms)
void xl_comments::write(const std::wstring & RootPath)
{
std::wstring vml_path = RootPath + FILE_SEPARATOR_STR + L"drawings";
NSDirectory::CreateDirectory(vml_path.c_str());
for (size_t i = 0; i < comments_.size(); i++)
{
content_type * contentTypes = this->get_main_document()->get_content_types_file().content();
@ -604,7 +628,6 @@ void xl_comments::write(const std::wstring & RootPath)
contentTypes->add_override(std::wstring(L"/xl/") + comments_[i].filename, kWSConType);
package::simple_element(comments_[i].filename, comments_[i].content).write(RootPath);
package::simple_element(comments_[i].vml_filename, comments_[i].vml_content).write(vml_path);
}
}

View File

@ -244,20 +244,27 @@ class xl_drawings: public element
{
public:
virtual void write(const std::wstring & RootPath);
void set_rels(rels_files * rels)
{
rels_ = rels;
}
xl_drawings(const std::vector<drawing_elm> & elms) : drawings_ ( elms )
//void set_rels(rels_files * rels)
// {
// rels_ = rels;
// }
//void set_vml_rels(rels_files * rels)
// {
// vml_rels_ = rels;
// }
xl_drawings(const std::vector<drawing_elm> & elms, const std::vector<drawing_elm> & vml_elms) : drawings_(elms), vml_drawings_(vml_elms)
{
}
static xl_drawings_ptr create(const std::vector<drawing_elm> & elms);
static xl_drawings_ptr create(const std::vector<drawing_elm> & elms, const std::vector<drawing_elm> & vml_elms);
private:
const std::vector<drawing_elm> & drawings_;
rels_files * rels_;
const std::vector<drawing_elm> & vml_drawings_;
//rels_files * rels_;
//rels_files * vml_rels_;
};
//----------------------------------------------------------------------------------------------------------
class xl_control_props_files : public element
@ -284,7 +291,7 @@ public:
void set_sharedStrings (element_ptr Element);
void set_connections (element_ptr Element);
void add_sheet (sheet_content_ptr sheet);
void set_media (mediaitems & _Mediaitems);
void set_media (mediaitems_ptr & _Mediaitems);
void set_drawings (element_ptr Element);
void set_vml_drawings (element_ptr Element);
void set_comments (element_ptr Element);

View File

@ -406,6 +406,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;
@ -485,6 +528,10 @@ void xlsx_table_state::serialize_table_format (std::wostream & strm)
CP_XML_ATTR(L"rightToLeft", 1);
std::wstring s_col, s_row;
bool bXSplit = false, bYSplit = false;
int nXSplit = 0, nYSplit = 0;
for (int i = 0; i < odfContext.Settings().get_table_view_count(0, tableName_); i++)
{
std::pair<std::wstring, std::wstring> value = odfContext.Settings().get_table_view(0, tableName_, i);
@ -494,9 +541,14 @@ void xlsx_table_state::serialize_table_format (std::wostream & strm)
CP_XML_ATTR(L"zoomScale", value.second);
CP_XML_ATTR(L"zoomScaleNormal", value.second);
}
if (value.first == L"ShowGrid") CP_XML_ATTR(L"showGridLines", value.second);
if (value.first == L"CursorPositionX") s_col = value.second;
if (value.first == L"CursorPositionY") s_row = value.second;
if (value.first == L"ShowGrid") CP_XML_ATTR(L"showGridLines", value.second);
else if (value.first == L"CursorPositionX") s_col = value.second;
else if (value.first == L"CursorPositionY") s_row = value.second;
else if (value.first == L"HorizontalSplitMode") bXSplit = (value.second == L"2");
else if (value.first == L"VerticalSplitMode") bYSplit = (value.second == L"2");
else if (value.first == L"HorizontalSplitPosition") nXSplit = boost::lexical_cast<int>(value.second);
else if (value.first == L"VerticalSplitPosition") nYSplit = boost::lexical_cast<int>(value.second);
}
int col = -1, row = -1;
@ -507,16 +559,26 @@ void xlsx_table_state::serialize_table_format (std::wostream & strm)
}
catch(...){}
if (bXSplit || bYSplit)
{
CP_XML_NODE(L"pane")
{
CP_XML_ATTR(L"xSplit", bXSplit ? nXSplit : 0);
CP_XML_ATTR(L"ySplit", bYSplit ? nYSplit : 0);
CP_XML_ATTR(L"topLeftCell", getCellAddress(nXSplit, nYSplit));
CP_XML_ATTR(L"activePane", L"bottomLeft");
CP_XML_ATTR(L"state", L"frozen");
}
}
if (col >= 0 && row >= 0)
{
CP_XML_NODE(L"selection")
{
CP_XML_ATTR(L"activeCell", getCellAddress(col, row));
CP_XML_ATTR(L"activeCellId", 0);
CP_XML_ATTR(L"pane", L"topLeft");
CP_XML_ATTR(L"pane", ((bXSplit || bYSplit) ? L"bottomLeft" : L"topLeft"));
CP_XML_ATTR(L"sqref", getCellAddress(col, row));
}
}
}
}
}

View File

@ -184,6 +184,7 @@ 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 dump_rels_hyperlinks (rels & Rels);
void dump_rels_ole_objects (rels & Rels);
@ -217,6 +218,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_;

View File

@ -290,6 +290,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();
@ -340,6 +357,12 @@ void xlsx_table_context::serialize_tableParts(std::wostream & _Wostream, rels &
// из за дебелизма мсофис которому ОБЯЗАТЕЛЬНО нужно прописывать имена колонок таблицы (и они должны быть еще
// прописаны и в самих данных таблицы !!
while (xlsx_data_ranges_[it->second]->header_values.size() > xlsx_data_ranges_[it->second]->cell_end.first -
xlsx_data_ranges_[it->second]->cell_start.first + 1)
{
xlsx_data_ranges_[it->second]->header_values.pop_back();
}
int i = xlsx_data_ranges_[it->second]->header_values.size() - 1;
for (; i >= 0; i--)
{
@ -505,6 +528,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);

View File

@ -83,6 +83,12 @@ public:
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 +102,7 @@ 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);
xlsx_table_metrics & get_table_metrics();

View File

@ -74,7 +74,10 @@ public:
void start_drawing_content();
std::wstring end_drawing_content();
void serialize_shared_strings(std::wostream & strm);
void start_only_text();
std::wstring end_only_text();
void serialize_shared_strings(std::wostream & strm);
void ApplyTextProperties (std::wstring style, std::wstring para_style, odf_reader::text_format_properties_content & propertiesOut);
void ApplyParagraphProperties (std::wstring style, odf_reader::paragraph_format_properties & propertiesOut);
@ -94,6 +97,7 @@ private:
bool in_span;
bool in_paragraph;
bool in_cell_content;
bool only_text;
odf_reader::styles_container & styles_;
odf_reader::text_format_properties_content * text_properties_cell_;
@ -126,7 +130,7 @@ void xlsx_text_context::Impl::serialize_shared_strings(std::wostream & strm)
xlsx_text_context::Impl::Impl(odf_reader::styles_container & styles): paragraphs_cout_(0),styles_(styles),
in_comment(false),in_draw(false),in_paragraph(false),in_span(false),in_cell_content(false)
in_comment(false),in_draw(false),in_paragraph(false),in_span(false),in_cell_content(false),only_text(false)
{
local_styles_ptr_ = NULL;
text_properties_cell_ = NULL;
@ -136,7 +140,7 @@ void xlsx_text_context::Impl::add_text(const std::wstring & text)
{
text_ << text;
if (!in_comment && !in_draw)
if (!in_comment && !in_draw && !only_text)
dump_run();
}
@ -149,7 +153,7 @@ void xlsx_text_context::Impl::start_paragraph(const std::wstring & styleName)
{
if (paragraphs_cout_++ > 0)
{
if ( in_comment == true )
if ( in_comment || only_text)
{
// конец предыдущего абзаца и начало следующего
//text_ << L"&#10;";
@ -169,7 +173,7 @@ void xlsx_text_context::Impl::start_paragraph(const std::wstring & styleName)
void xlsx_text_context::Impl::end_paragraph()
{
if (!in_comment && !in_draw)
if (!in_comment && !in_draw && !only_text)
{
dump_run();
paragraph_style_name_ = L"";
@ -181,7 +185,7 @@ void xlsx_text_context::Impl::start_span(const std::wstring & styleName)//кус
{
int text_size = text_.str().length();
if (in_comment || in_draw)
if (in_comment || in_draw || only_text)
{
if (( span_style_name_ != styleName && text_size > 0 ) || in_span)
{
@ -202,12 +206,12 @@ void xlsx_text_context::Impl::start_span(const std::wstring & styleName)//кус
void xlsx_text_context::Impl::end_span() //odf корявенько написан - возможны повторы стилей в последовательных кусках текста
//пока с анализом стилей тока комменты - остальные текстовые куски как есть.. с охрененным возможно дубляжом
{
if (!in_comment)
if (!in_comment && !only_text)
{
dump_run();
span_style_name_=L"";
span_style_name_ = L"";
}
in_span=false;
in_span = false;
}
std::wstring xlsx_text_context::Impl::end_span2()
@ -375,7 +379,9 @@ std::wstring xlsx_text_context::Impl::dump_paragraph(/*bool last*/)
std::wstring str_run = run_.str();
if (str_run.length() > 0 || paragraph_style_name_.length() > 0)
if (only_text) return str_run;
if (false == str_run.empty() || false == paragraph_style_name_.empty())
{
CP_XML_WRITER(paragraph_)
{
@ -402,8 +408,7 @@ std::wstring xlsx_text_context::Impl::dump_run()
{
const std::wstring content = xml::utils::replace_text_to_xml(text_.str());
if (content.empty())
return L"";
if (content.empty()) return L"";
std::wstring prefix_draw;
if (in_draw) prefix_draw = L"a:";
@ -418,7 +423,10 @@ std::wstring xlsx_text_context::Impl::dump_run()
CP_XML_NODE(prefix_draw + L"t")
{
if (!in_draw)CP_XML_ATTR(L"xml:space", L"preserve");
if (false == in_draw && std::wstring::npos != content.find(L" "))
{
CP_XML_ATTR(L"xml:space", L"preserve");
}
CP_XML_STREAM() << content;
}
@ -449,7 +457,35 @@ void xlsx_text_context::Impl::start_cell_content()
text_properties_cell_ = NULL;
}
void xlsx_text_context::Impl::start_only_text()
{
paragraphs_cout_ = 0;
run_.str(std::wstring());
paragraph_.str(std::wstring());
text_.str(std::wstring());
paragraph_style_name_ = L"";
span_style_name_ = L"";
only_text = true;
}
std::wstring xlsx_text_context::Impl::end_only_text()
{
std::wstring message = dump_run();
paragraphs_cout_ = 0;
run_.str(std::wstring());
paragraph_.str(std::wstring());
text_.str(std::wstring());
paragraph_style_name_ = L"";
span_style_name_ = L"";
only_text = false;
return message;
}
void xlsx_text_context::Impl::start_comment_content()
{
paragraphs_cout_ = 0;
@ -585,26 +621,30 @@ bool xlsx_text_context::is_drawing_context()
{
return impl_->is_drawing_context();
}
void xlsx_text_context::start_cell_content()
{
return impl_->start_cell_content();
}
int xlsx_text_context::end_cell_content()
{
return impl_->end_cell_content();
}
void xlsx_text_context::start_comment_content()
{
return impl_->start_comment_content();
}
std::wstring xlsx_text_context::end_comment_content()
{
return impl_->end_comment_content();
}
void xlsx_text_context::start_only_text()
{
return impl_->start_only_text();
}
std::wstring xlsx_text_context::end_only_text()
{
return impl_->end_only_text();
}
void xlsx_text_context::start_drawing_content()
{
return impl_->start_drawing_content();

View File

@ -70,6 +70,9 @@ public:
void start_cell_content();
int end_cell_content();
void start_only_text();
std::wstring end_only_text();
void start_comment_content();
std::wstring end_comment_content();

View File

@ -69,12 +69,12 @@ xlsx_conversion_context::xlsx_conversion_context(odf_reader::odf_document * odfD
xlsx_table_context_ (this, xlsx_text_context_),
math_context_ (odf_document_->odf_context().fontContainer(), true),
xlsx_style_ (this),
maxDigitSize_ (std::make_pair(-1.f, -1.f) ),
default_style_ ( (std::numeric_limits<size_t>::max)() ),
mediaitems_ (odf_document_->get_folder()),
xlsx_drawing_context_handle_(mediaitems_)
default_style_ ( (std::numeric_limits<size_t>::max)() )
{
mediaitems_ = boost::make_shared<mediaitems>(odf_document_->get_folder());
drawing_context_handle_ = boost::make_shared<xlsx_drawing_context_handle>(mediaitems_);
}
std::unordered_map<std::wstring, int> xlsx_conversion_context::mapExternalLink_;
@ -90,7 +90,16 @@ xlsx_conversion_context::~xlsx_conversion_context()
void xlsx_conversion_context::set_font_directory(std::wstring pathFonts)
{
mediaitems_.set_font_directory(pathFonts);
mediaitems_->set_font_directory(pathFonts);
}
void xlsx_conversion_context::set_drawing_context_handle(xlsx_drawing_context_handle_ptr &handle)
{
drawing_context_handle_ = handle;
}
void xlsx_conversion_context::set_mediaitems(mediaitems_ptr &items)
{
mediaitems_ = items;
}
void xlsx_conversion_context::start_chart(std::wstring name)
@ -323,8 +332,8 @@ void xlsx_conversion_context::end_document()
output_document_->get_content_types_file().set_media(get_mediaitems());
output_document_->get_xl_files().set_media(get_mediaitems());
package::xl_drawings_ptr drawings = package::xl_drawings::create(xlsx_drawing_context_handle_.content());
output_document_->get_xl_files().set_drawings(drawings);
package::xl_drawings_ptr drawings = package::xl_drawings::create(drawing_context_handle_->content(), drawing_context_handle_->content_vml());
output_document_->get_xl_files().set_drawings(drawings);
package::xl_comments_ptr comments = package::xl_comments::create(xlsx_comments_context_handle_.content());
output_document_->get_xl_files().set_comments(comments);
@ -466,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());
@ -496,42 +506,37 @@ void xlsx_conversion_context::end_table()
L"../pivotTables/pivotTable" + std::to_wstring(it->second) + L".xml"));
}
if (!get_drawing_context().empty())
if (false == get_drawing_context().empty())
{
std::wstringstream strm;
get_drawing_context().serialize(strm);
const std::pair<std::wstring, std::wstring> drawingName
= xlsx_drawing_context_handle_.add_drawing_xml(strm.str(), get_drawing_context().get_drawings() );
= drawing_context_handle_->add_drawing_xml(strm.str(), get_drawing_context().get_drawings() );
current_sheet().set_drawing_link(drawingName.first, drawingName.second);
CP_XML_WRITER(current_sheet().drawing())
{
CP_XML_NODE(L"drawing")
{
CP_XML_ATTR(L"r:id", drawingName.second);
}
}
}
get_table_context().serialize_background (current_sheet().drawing());
if (false == get_drawing_context().vml_empty())
{
std::wstringstream strm;
get_drawing_context().serialize_vml(strm);
const std::pair<std::wstring, std::wstring> vml_drawingName
= drawing_context_handle_->add_drawing_vml(strm.str(), get_drawing_context().get_drawings() );
if (!get_comments_context().empty())
current_sheet().set_vml_drawing_link(vml_drawingName.first, vml_drawingName.second);
}
//get_table_context().serialize_background (current_sheet().picture());
if (false == get_comments_context().empty())
{
std::wstringstream strm;
get_comments_context().serialize(strm);
std::wstringstream vml_strm;
get_comments_context().serialize_vml(vml_strm);
const std::pair<std::wstring, std::wstring> commentsName
= xlsx_comments_context_handle_.add_comments_xml(strm.str(), vml_strm.str(),get_comments_context().get_comments() );
const std::pair<std::wstring, std::wstring> vml_drawingName
=xlsx_comments_context_handle_.get_vml_drawing_xml();
= xlsx_comments_context_handle_.add_comments_xml(strm.str(), get_comments_context().get_comments() );
current_sheet().set_comments_link(commentsName.first, commentsName.second);
current_sheet().set_vml_drawing_link(vml_drawingName.first, vml_drawingName.second);
}
get_table_context().end_table();
}
@ -730,7 +735,7 @@ std::pair<float,float> xlsx_conversion_context::getMaxDigitSize()
else
font_size =10;
maxDigitSize_ = utils::GetMaxDigitSizePixels(font_name.c_str(), font_size, 96., 0, mediaitems_.applicationFonts());
maxDigitSize_ = utils::GetMaxDigitSizePixels(font_name.c_str(), font_size, 96., 0, mediaitems_->applicationFonts());
}
return maxDigitSize_;
}
@ -749,9 +754,9 @@ xlsx_drawing_context & xlsx_conversion_context::get_drawing_context()
return get_table_context().get_drawing_context();
}
xlsx_drawing_context_handle & xlsx_conversion_context::get_drawing_context_handle()
xlsx_drawing_context_handle_ptr & xlsx_conversion_context::get_drawing_context_handle()
{
return xlsx_drawing_context_handle_;
return drawing_context_handle_;
}
xlsx_comments_context & xlsx_conversion_context::get_comments_context()
{

View File

@ -188,12 +188,16 @@ public:
xlsx_pivots_context & get_pivots_context() { return xlsx_pivots_context_;}
xlsx_table_metrics & get_table_metrics();
xlsx_drawing_context & get_drawing_context();
xlsx_drawing_context_handle & get_drawing_context_handle();
xlsx_comments_context & get_comments_context();
xlsx_comments_context_handle & get_comments_context_handle();
xlsx_dataValidations_context& get_dataValidations_context() { return xlsx_dataValidations_context_;}
mediaitems & get_mediaitems() { return mediaitems_; }
xlsx_drawing_context_handle_ptr & get_drawing_context_handle();
void set_drawing_context_handle(xlsx_drawing_context_handle_ptr &handle);
mediaitems_ptr & get_mediaitems() { return mediaitems_; }
void set_mediaitems(mediaitems_ptr &items);
static std::unordered_map<std::wstring, int> mapExternalLink_;
std::map<std::wstring, int> mapUsedNames_;
@ -213,7 +217,7 @@ private:
std::pair<float,float> maxDigitSize_;
num_format_context num_format_context_;
size_t default_style_;
mediaitems mediaitems_;
mediaitems_ptr mediaitems_;
std::multimap<std::wstring, int> mapPivotsTableView_;
std::map<std::wstring, std::wstring> control_props_;
@ -223,9 +227,9 @@ private:
xlsx_table_context xlsx_table_context_;
xlsx_text_context xlsx_text_context_;
xlsx_pivots_context xlsx_pivots_context_;
xlsx_drawing_context_handle xlsx_drawing_context_handle_;
xlsx_comments_context_handle xlsx_comments_context_handle_;
xlsx_dataValidations_context xlsx_dataValidations_context_;
xlsx_drawing_context_handle_ptr drawing_context_handle_;
math_context math_context_;
forms_context forms_context_;

View File

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

View File

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

View File

@ -168,15 +168,20 @@ void calc_tab_stops(const style_instance * styleInstance, oox::tabs_context & co
}
styleInstance = styleInstance->parent();
}
double margin_left = 0;
for (size_t i = 0; i < parProps.size(); i++)
{
if (parProps[i]->content_.fo_margin_left_)
margin_left = 20.0 * parProps[i]->content_.fo_margin_left_->get_length().get_value_unit(odf_types::length::pt);
if (parProps[i]->content_.style_tab_stops_)
{
style_tab_stops *tab_stops = dynamic_cast<style_tab_stops*>(parProps[i]->content_.style_tab_stops_.get());
context.reset();
for (size_t j = 0; j < tab_stops->content_.size(); j++)
{
context.add(tab_stops->content_[j]);
context.add(tab_stops->content_[j], margin_left);
}
}
}

View File

@ -221,6 +221,11 @@ void object_odf_context::docx_convert(oox::docx_conversion_context & Context)
chart_context.set_cache_only(true);
}
if (false == userShapes.first.empty())
{
chart_context.set_userShapes(userShapes);
}
Context.end_chart();
}
else if (object_type_ == 2 && office_text_)

View File

@ -206,6 +206,7 @@ public:
std::map<std::wstring, _cell>cash_pivot;
std::wstring embeddedData;
std::pair<std::wstring, std::wstring> userShapes;
//---------------------------------------
std::wstring target_table_;
std::wstring table_name_;

View File

@ -124,9 +124,8 @@ namespace chart {
std::wstring chart_name_;
std::wstring style_name_;
std::vector<grid> grids_;
int type_;
};
int type_;
};
struct series : public simple
{
struct point : public simple

View File

@ -265,7 +265,13 @@ void common_break_attlist::serialize(CP_ATTR_NODE)
void common_page_number_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:page-number", style_page_number_);
_CP_OPT(std::wstring) str;
CP_APPLY_ATTR(L"style:page-number", str);
if ((str) && (*str != L"auto"))
{
style_page_number_ = XmlUtils::GetInteger(*str);
}
}
void common_page_number_attlist::apply_from(const common_page_number_attlist & Other)
{
@ -295,14 +301,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_);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -880,5 +904,32 @@ 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)
{
CP_XML_ATTR_OPT(L"dr3d:transform", transform_);
CP_XML_ATTR_OPT(L"dr3d:vrp", vrp_);
CP_XML_ATTR_OPT(L"dr3d:vpn", vpn_);
CP_XML_ATTR_OPT(L"dr3d:vup", vup_);
CP_XML_ATTR_OPT(L"dr3d:focal-length", focal_length_);
CP_XML_ATTR_OPT(L"dr3d:distance", distance_);
CP_XML_ATTR_OPT(L"dr3d:projection", projection_);
CP_XML_ATTR_OPT(L"dr3d:ambient-color", ambient_color_);
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 )
{
CP_APPLY_ATTR(L"dr3d:vpn", vpn_);
CP_APPLY_ATTR(L"dr3d:vrp", vrp_);
CP_APPLY_ATTR(L"dr3d:vup", vup_);
CP_APPLY_ATTR(L"dr3d:focal-length", focal_length_);
CP_APPLY_ATTR(L"dr3d:distance", distance_);
CP_APPLY_ATTR(L"dr3d:projection", projection_);
CP_APPLY_ATTR(L"dr3d:ambient-color", ambient_color_);
CP_APPLY_ATTR(L"dr3d:shade-mode", shade_mode_);
CP_APPLY_ATTR(L"dr3d:lighting-mode", lighting_mode_);
CP_APPLY_ATTR(L"dr3d:transform", transform_);
}
}
}

View File

@ -214,8 +214,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
@ -612,5 +617,25 @@ public:
_CP_OPT(std::wstring) condition_;
};
class dr3d_attlist
{
public:
void add_attributes ( const xml::attributes_wc_ptr & Attributes );
void serialize (CP_ATTR_NODE);
_CP_OPT(vector3D) vpn_;
_CP_OPT(vector3D) vrp_;
_CP_OPT(vector3D) vup_;
_CP_OPT(length) focal_length_;
_CP_OPT(length) distance_;
_CP_OPT(std::wstring) projection_;
_CP_OPT(color) ambient_color_;
_CP_OPT(std::wstring) shade_mode_;
_CP_OPT(std::wstring) lighting_mode_;
_CP_OPT(std::wstring) transform_;
};
}
}

View File

@ -35,10 +35,11 @@
#include <iostream>
#include <sstream>
#include <boost/algorithm/string.hpp>
namespace cpdoccore { namespace odf_types {
std::wostream & operator << (std::wostream & _Wostream, const length::unit _Unit)
std::wostream & operator<< (std::wostream & _Wostream, const length::unit _Unit)
{
switch(_Unit)
{
@ -259,6 +260,26 @@ double length::get_value_unit(unit Unit) const
return 0.0;
}
}
//--------------------------------------------------------------------
std::wostream & operator<< (std::wostream & _Wostream, const vector3D & _vector3D)
{
_Wostream << L"(" << _vector3D.get_x() << L" " << _vector3D.get_y() << L" " << _vector3D.get_z() << L")";
return _Wostream;
}
vector3D vector3D::parse(const std::wstring & Str)
{
if (Str.length() < 8) return vector3D();
std::wstring vsp = Str.substr(1, Str.length() - 2);
std::vector<std::wstring> coord;
boost::algorithm::split(coord, vsp, boost::algorithm::is_any_of(L" "), boost::algorithm::token_compress_on);
if (coord.size() != 3) return vector3D();
return vector3D(std::stod(coord[0]), std::stod(coord[1]), std::stod(coord[2]));
}
} }

View File

@ -52,7 +52,6 @@ public:
emu
};
public:
length(double v = 0.0, unit u = none) : value_(v), unit_(u)
{}
@ -87,11 +86,39 @@ length operator* (length _Length1, double val);
bool operator== (length & _Length1, length & _Length2);
bool operator== (const length & _Length1, const length & _Length2);
typedef length coordinate;
//-------------------------------------------------------------
class vector3D
{
public:
vector3D(double x = 0.0, double y = 0.0, double z = 0.0) : x_(x), y_(y), z_(z)
{}
double get_x() const
{
return x_;
}
double get_y() const
{
return y_;
}
double get_z() const
{
return z_;
}
static vector3D parse(const std::wstring & Str);
private:
double x_;
double y_;
double z_;
};
std::wostream & operator<< (std::wostream & _Wostream, const vector3D & _vector3D);
}
APPLY_PARSE_XML_ATTRIBUTES(odf_types::length);
APPLY_PARSE_XML_ATTRIBUTES(odf_types::vector3D);
}

View File

@ -499,6 +499,15 @@ void Compute_GraphicFill(const common_draw_fill_attlist & props, const office_el
fill.gradient = oox::oox_gradient_fill::create();
Compute_GradientFill(image_style, fill.gradient);
if (fill.opacity)
{
for (size_t i = 0; i < fill.gradient->colors.size(); i++)
{
if (!fill.gradient->colors[i].opacity)
fill.gradient->colors[i].opacity = fill.opacity;
}
}
}
}
}
@ -553,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

@ -207,6 +207,11 @@ void draw_g::add_child_element( xml::sax * Reader, const std::wstring & Ns, cons
if (position_child_x2 < x + cx || position_child_x2 == 0x7fffffff) position_child_x2 = x + cx;
if (position_child_y2 < y + cy || position_child_y2 == 0x7fffffff) position_child_y2 = y + cy;
if (frame->is_object_)
{
object_index = content_.size() - 1;
}
}
else if (shape)
{
@ -256,16 +261,20 @@ void draw_frame::add_attributes( const xml::attributes_wc_ptr & Attributes )
void draw_frame::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if (CP_CHECK_NAME(L"draw", L"text-box") ||
CP_CHECK_NAME(L"draw", L"image") ||//копия объекта в виде картинки ну.. или просто картинка
CP_CHECK_NAME(L"draw", L"object") ||//месторасположение embedded объекта
CP_CHECK_NAME(L"draw", L"object-ole") ||
CP_CHECK_NAME(L"draw", L"applet") ||
CP_CHECK_NAME(L"draw", L"floating-frame") ||
CP_CHECK_NAME(L"draw", L"plugin") ||
CP_CHECK_NAME(L"table", L"table")
)
CP_CHECK_NAME(L"draw", L"image") ||//копия объекта в виде картинки ну.. или просто картинка
CP_CHECK_NAME(L"table", L"table") ||
CP_CHECK_NAME(L"draw", L"object-ole")||
CP_CHECK_NAME(L"draw", L"applet") ||
CP_CHECK_NAME(L"draw", L"floating-frame")||
CP_CHECK_NAME(L"draw", L"plugin")
)
{
CP_CREATE_ELEMENT(content_);
}
else if CP_CHECK_NAME(L"draw", L"object") //embedded объект
{
CP_CREATE_ELEMENT(content_);
is_object_ = true;
}
else if CP_CHECK_NAME(L"office", L"event-listeners")
{
@ -324,10 +333,6 @@ void draw_text_box::add_child_element( xml::sax * Reader, const std::wstring & N
CP_CREATE_ELEMENT(content_);
}
void draw_text_box::add_text(const std::wstring & Text)
{
}
// draw:object
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * draw_object::ns = L"draw";

View File

@ -153,7 +153,7 @@ public:
static const ElementType type = typeDrawFrame;
CPDOCCORE_DEFINE_VISITABLE();
draw_frame() : oox_drawing_(), idx_in_owner(-1) {}
draw_frame() : oox_drawing_(), idx_in_owner(-1), is_object_(false) {}
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
@ -185,10 +185,10 @@ public:
oox_drawing_ptr oox_drawing_;
bool is_object_;
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
};
CP_REGISTER_OFFICE_ELEMENT2(draw_frame);
@ -209,7 +209,7 @@ public:
static const ElementType type = typeDrawG;
CPDOCCORE_DEFINE_VISITABLE();
draw_g() : position_child_x1(0x7fffffff), position_child_y1(0x7fffffff), position_child_x2(0x7fffffff), position_child_y2(0x7fffffff) {}
draw_g() : object_index(-1), position_child_x1(0x7fffffff), position_child_y1(0x7fffffff), position_child_x2(0x7fffffff), position_child_y2(0x7fffffff) {}
virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const;
@ -228,6 +228,8 @@ public:
int position_child_x2;
int position_child_y2;
int object_index ;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
@ -271,7 +273,8 @@ public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
virtual void add_text(const std::wstring & Text){}
virtual void add_space(const std::wstring & Text){}
};
CP_REGISTER_OFFICE_ELEMENT2(draw_text_box);
@ -306,6 +309,7 @@ public:
odf_document_ptr odf_document_;
office_element_ptr_array content_; //for case group with object
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);

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);
@ -923,10 +923,10 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
if ((drawing->fill.bitmap) && (drawing->fill.bitmap->rId.empty()))
{
std::wstring href = drawing->fill.bitmap->xlink_href_;
drawing->fill.bitmap->rId = Context.get_mediaitems().add_or_find(href, oox::typeImage, drawing->fill.bitmap->isInternal, href);
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);
@ -1196,7 +1210,7 @@ void draw_image::docx_convert(oox::docx_conversion_context & Context)
drawing->fill.bitmap = oox::oox_bitmap_fill::create();
drawing->fill.type = 2;
drawing->fill.bitmap->isInternal = false;
drawing->fill.bitmap->rId = Context.get_mediaitems().add_or_find(href, oox::typeImage, drawing->fill.bitmap->isInternal, href);
drawing->fill.bitmap->rId = Context.get_mediaitems()->add_or_find(href, oox::typeImage, drawing->fill.bitmap->isInternal, href);
drawing->fill.bitmap->bStretch = true;
const std::wstring styleName = frame->common_draw_attlists_.shape_with_text_and_styles_.
@ -1216,7 +1230,7 @@ void draw_image::docx_convert(oox::docx_conversion_context & Context)
std::wstring fileName = Context.root()->get_folder() + FILE_SEPARATOR_STR + xlink_attlist_.href_.get_value_or(L"");
drawing->fill.bitmap->bCrop = parse_clipping(strRectClip, fileName, drawing->fill.bitmap->cropRect, Context.get_mediaitems().applicationFonts());
drawing->fill.bitmap->bCrop = parse_clipping(strRectClip, fileName, drawing->fill.bitmap->cropRect, Context.get_mediaitems()->applicationFonts());
}
if (properties->common_draw_fill_attlist_.draw_luminance_)
{
@ -1352,6 +1366,32 @@ void draw_g::docx_convert(oox::docx_conversion_context & Context)
Context.add_delayed_element(this);
return;
}
if (object_index >= 0) //только в документах нельзя объект объединять с шейпами в группы (
{
draw_frame *frame = dynamic_cast<draw_frame*>(content_[object_index].get());
frame->common_draw_attlists_.shape_with_text_and_styles_.common_text_anchor_attlist_.type_ =
common_draw_attlists_.shape_with_text_and_styles_.common_text_anchor_attlist_.type_;
for (size_t i = 0; i < frame->content_.size(); i++)
{
draw_object *object = dynamic_cast<draw_object*>(frame->content_[i].get());
if (!object)continue;
for (size_t j = 0; j < content_.size(); j++)
{
if (j == object_index) continue;
object->content_.push_back(content_[j]);
}
break;
}
frame->docx_convert(Context);
return;
}
oox::_docx_drawing drawing = oox::_docx_drawing();
@ -1451,7 +1491,7 @@ void draw_frame::docx_convert(oox::docx_conversion_context & Context)
bool bImage = false;
if (content_.empty() == false)
{
if (content_[0]->get_type() == typeDrawImage)
if (content_[0]->get_type() == typeDrawImage || content_[0]->get_type() == typeDrawObject || content_[0]->get_type() == typeDrawObjectOle )
bImage = true;
}
if (Context.get_drawing_context().get_current_level() > 0 && !Context.get_drawing_context().in_group() && !bImage)
@ -1541,6 +1581,10 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
process_build_object process_build_object_(objectBuild, odf_document_->odf_context());
contentSubDoc->accept(process_build_object_);
frame = Context.get_drawing_context().get_current_frame(); //owner
if (frame)
drawing = dynamic_cast<oox::_docx_drawing *>(frame->oox_drawing_.get());
if (objectBuild.table_table_)
{
oox::xlsx_conversion_context xlsx_context(odf_document_.get());
@ -1556,7 +1600,7 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
NSDirectory::CreateDirectory(href_folder);
outputXlsx.write(href_folder);
std::wstring href = L"Microsoft_Excel_Worksheet_" + std::to_wstring(Context.get_mediaitems().count_object + 1) + L".xlsx";
std::wstring href = L"Microsoft_Excel_Worksheet_" + std::to_wstring(Context.get_mediaitems()->count_object + 1) + L".xlsx";
COfficeUtils oCOfficeUtils(NULL);
if (S_OK == oCOfficeUtils.CompressFileOrDirectory(href_folder, odfPath + FILE_SEPARATOR_STR + href, true))
@ -1565,11 +1609,34 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
}
}
if (false == content_.empty())
{
oox::xlsx_conversion_context xlsx_context(Context.root());
xlsx_context.set_drawing_context_handle(Context.get_chart_drawing_handle());
xlsx_context.set_mediaitems(Context.get_mediaitems());
xlsx_context.get_table_context().start_table(L"", L"", 0);
for (size_t i = 0; i < content_.size(); ++i)
{
xlsx_context.get_drawing_context().set_rel_anchor(drawing->cx, drawing->cy);
content_[i]->xlsx_convert(xlsx_context);
}
xlsx_context.get_table_context().end_table();
xlsx_context.get_drawing_context().process_objects(xlsx_context.get_table_metrics());
std::wstringstream strm;
xlsx_context.get_drawing_context().serialize(strm, L"cdr");
const std::pair<std::wstring, std::wstring> drawingName =
xlsx_context.get_drawing_context_handle()->add_drawing_xml(strm.str(), xlsx_context.get_drawing_context().get_drawings(), oox::typeChartUserShapes );
objectBuild.userShapes = drawingName;
}
objectBuild.docx_convert(Context);
frame = Context.get_drawing_context().get_current_frame(); //owner
if (frame)
drawing = dynamic_cast<oox::_docx_drawing *>(frame->oox_drawing_.get());
}
//------------------------------------------------------------------------------------------------------------
if (!frame || !drawing)
@ -1582,7 +1649,7 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
drawing->type = oox::typeChart;
bool isMediaInternal = true;
drawing->objectId = Context.get_mediaitems().add_or_find(href, drawing->type, isMediaInternal, href);
drawing->objectId = Context.get_mediaitems()->add_or_find(href, drawing->type, isMediaInternal, href);
}
else if (objectBuild.object_type_ == 2 ) //embedded text
{
@ -1641,7 +1708,7 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
drawing->objectId = Context.get_mediaitems().add_or_find(href, drawing->type, isMediaInternal, href);
drawing->objectId = Context.get_mediaitems()->add_or_find(href, drawing->type, isMediaInternal, href);
drawing->objectProgId = L"Excel.Sheet.12";
}
}
@ -1682,7 +1749,7 @@ void draw_object_ole::docx_convert(oox::docx_conversion_context & Context)
NSFile::CFileBinary::Copy(objectPath, objectPath + extension);
bool isMediaInternal = true;
drawing->objectId = Context.get_mediaitems().add_or_find(href + extension, drawing->type, isMediaInternal, href);
drawing->objectId = Context.get_mediaitems()->add_or_find(href + extension, drawing->type, isMediaInternal, href);
}
void draw_control::docx_convert(oox::docx_conversion_context & Context)

View File

@ -303,7 +303,7 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
NSDirectory::CreateDirectory(href_folder);
outputXlsx.write(href_folder);
std::wstring href = L"Microsoft_Excel_Worksheet_" + std::to_wstring(Context.get_mediaitems().count_object + 1) + L".xlsx";
std::wstring href = L"Microsoft_Excel_Worksheet_" + std::to_wstring(Context.get_mediaitems()->count_object + 1) + L".xlsx";
COfficeUtils oCOfficeUtils(NULL);
if (S_OK == oCOfficeUtils.CompressFileOrDirectory(href_folder, odfPath + FILE_SEPARATOR_STR + href, true))

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