summaryrefslogtreecommitdiffstats
path: root/ios/LibreOfficeLight
diff options
context:
space:
mode:
Diffstat (limited to 'ios/LibreOfficeLight')
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/project.pbxproj635
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Debug.xcscheme98
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Release.xcscheme91
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/AppDelegate.swift117
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/Contents.json116
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-1024.pngbin0 -> 29447 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-120.pngbin0 -> 7627 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-152.pngbin0 -> 9043 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-167.pngbin0 -> 10012 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-180.pngbin0 -> 11718 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-20.pngbin0 -> 1204 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-29.pngbin0 -> 1674 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-40.pngbin0 -> 2194 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-58.pngbin0 -> 3212 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-60.pngbin0 -> 3425 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-76.pngbin0 -> 4366 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-80.pngbin0 -> 4458 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-87.pngbin0 -> 4744 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/Contents.json23
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back.pngbin0 -> 805 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@2x.pngbin0 -> 1111 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@3x.pngbin0 -> 1813 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/Contents.json6
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/drawing-template.icnsbin0 -> 46225 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/drawing.icnsbin0 -> 43334 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/empty-document.icobin0 -> 35123 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/empty-template.icobin0 -> 35123 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/extension.icnsbin0 -> 39192 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/formula.icnsbin0 -> 43893 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/main.icnsbin0 -> 83974 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/master-document.icnsbin0 -> 40262 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/oasis-database.icnsbin0 -> 269094 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/oasis-drawing-template.icobin0 -> 58428 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/oasis-drawing.icnsbin0 -> 218393 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/oasis-formula.icobin0 -> 47043 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/oasis-master-document-template.icnsbin0 -> 118979 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/oasis-master-document.icobin0 -> 38441 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/oasis-presentation-template.icnsbin0 -> 277602 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/oasis-presentation.icobin0 -> 44754 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/oasis-spreadsheet-template.icnsbin0 -> 292177 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/oasis-spreadsheet.icnsbin0 -> 168743 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/oasis-text-template.icobin0 -> 54827 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/oasis-text.icobin0 -> 46469 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/oasis-web-template.icnsbin0 -> 333385 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/open.icobin0 -> 35123 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/presentation-template.icobin0 -> 54551 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/presentation.icobin0 -> 44754 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/soffice.icobin0 -> 35123 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/spreadsheet-template.icnsbin0 -> 46239 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/spreadsheet.icnsbin0 -> 43146 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/text-template.icnsbin0 -> 43403 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/Contents.json12
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/text.icnsbin0 -> 40399 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/Contents.json23
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/intro.pngbin0 -> 71016 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/Contents.json23
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu.pngbin0 -> 586 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@2x.pngbin0 -> 648 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@3x.pngbin0 -> 722 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/ButtonScrollView.swift145
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/DocumentActions.swift75
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/DocumentController.swift598
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/DocumentOverlaysView.swift68
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/DocumentTiledView.swift244
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Info.plist1812
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/AsyncUtil.swift92
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/Document.swift592
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/DocumentHolder.swift345
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/LOKitThread.swift139
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitIOSTests.swift102
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitWrapper.swift231
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/RenderCache.swift78
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LOKit/Util.swift43
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight-Prefix.pch22
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.entitlements18
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/.xccurrentversion5
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/LibreOfficeLight.xcdatamodel/contents4
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/PropertiesController.swift99
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/Root.plist38
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/en.lproj/Root.stringsbin0 -> 546 bytes
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/UIViewExtensions.swift74
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/ViewPrintManager.swift27
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/ViewProperties.swift30
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/en.lproj/LaunchScreen.xib109
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/en.lproj/Main.storyboard501
-rw-r--r--ios/LibreOfficeLight/LibreOfficeLight/lokit-Bridging-Header.h16
114 files changed, 6987 insertions, 0 deletions
diff --git a/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/project.pbxproj b/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..819a41962
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/project.pbxproj
@@ -0,0 +1,635 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 48;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 39284DB31FA5F207006F43E4 /* DocumentActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39284DB21FA5F207006F43E4 /* DocumentActions.swift */; };
+ 392ED9B31E5E4B03005C8435 /* ViewPrintManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392ED9B21E5E4B03005C8435 /* ViewPrintManager.swift */; };
+ 3941EF15204B4C8A00082486 /* unorc in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF06204B4C8900082486 /* unorc */; };
+ 3941EF16204B4C8A00082486 /* fundamentalrc in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF07204B4C8900082486 /* fundamentalrc */; };
+ 3941EF17204B4C8A00082486 /* program in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF08204B4C8900082486 /* program */; };
+ 3941EF18204B4C8A00082486 /* services.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF09204B4C8900082486 /* services.rdb */; };
+ 3941EF19204B4C8A00082486 /* oovbaapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF0A204B4C8900082486 /* oovbaapi.rdb */; };
+ 3941EF1A204B4C8A00082486 /* registry in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF0B204B4C8900082486 /* registry */; };
+ 3941EF1B204B4C8A00082486 /* services in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF0C204B4C8900082486 /* services */; };
+ 3941EF1C204B4C8A00082486 /* offapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF0D204B4C8900082486 /* offapi.rdb */; };
+ 3941EF1D204B4C8A00082486 /* filter in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF0E204B4C8900082486 /* filter */; };
+ 3941EF1E204B4C8A00082486 /* rc in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF0F204B4C8900082486 /* rc */; };
+ 3941EF1F204B4C8A00082486 /* udkapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF10204B4C8900082486 /* udkapi.rdb */; };
+ 3941EF20204B4C8A00082486 /* icudt62l.dat in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF11204B4C8900082486 /* icudt62l.dat */; };
+ 3941EF21204B4C8A00082486 /* welcome.odt in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF12204B4C8900082486 /* welcome.odt */; };
+ 3941EF22204B4C8A00082486 /* config in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF13204B4C8900082486 /* config */; };
+ 3941EF23204B4C8A00082486 /* share in Resources */ = {isa = PBXBuildFile; fileRef = 3941EF14204B4C8900082486 /* share */; };
+ 39514E002057DC55005599D0 /* shared in Resources */ = {isa = PBXBuildFile; fileRef = 39514DFF2057DC55005599D0 /* shared */; };
+ 39514E082057E4A8005599D0 /* inc in Resources */ = {isa = PBXBuildFile; fileRef = 39514E072057E4A8005599D0 /* inc */; };
+ 396F92F71E7AE62400A28C82 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 396F92F61E7AE62400A28C82 /* Settings.bundle */; };
+ 397868D61E59A3EA007F9248 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 397868D81E59A3EA007F9248 /* LaunchScreen.xib */; };
+ 397E08FE1E597BD8001374E0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 397E08FD1E597BD8001374E0 /* AppDelegate.swift */; };
+ 397E09031E597BD8001374E0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 397E09011E597BD8001374E0 /* Main.storyboard */; };
+ 397E09081E597BD8001374E0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 397E09071E597BD8001374E0 /* Assets.xcassets */; };
+ 3992D85A1E5B762A00BEA987 /* DocumentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3992D8591E5B762A00BEA987 /* DocumentController.swift */; };
+ 399648471E5B87DC00E73E83 /* ViewProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399648461E5B87DC00E73E83 /* ViewProperties.swift */; };
+ 39EF4E2F1FA500C9001914AC /* PropertiesController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39EF4E2E1FA500C9001914AC /* PropertiesController.swift */; };
+ FC31D01E2012F65500E7F402 /* DocumentHolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC31D01D2012F65500E7F402 /* DocumentHolder.swift */; };
+ FC31D0202012F6D300E7F402 /* RenderCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC31D01F2012F6D300E7F402 /* RenderCache.swift */; };
+ FC31D02B2013500E00E7F402 /* ButtonScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC31D02A2013500E00E7F402 /* ButtonScrollView.swift */; };
+ FC31D02D2015DE1700E7F402 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC31D02C2015DE1700E7F402 /* UIViewExtensions.swift */; };
+ FCAB1CB82009DB6900F1CC34 /* DocumentOverlaysView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAB1CB72009DB6900F1CC34 /* DocumentOverlaysView.swift */; };
+ FCC2E3FA2004A01500CEB504 /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC2E3F62004A01400CEB504 /* Document.swift */; };
+ FCC2E3FC2004A01500CEB504 /* LibreOfficeKitWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC2E3F82004A01400CEB504 /* LibreOfficeKitWrapper.swift */; };
+ FCC2E3FD2004A01500CEB504 /* LOKitThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC2E3F92004A01400CEB504 /* LOKitThread.swift */; };
+ FCC2E3FF2004B59B00CEB504 /* DocumentTiledView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC2E3FE2004B59B00CEB504 /* DocumentTiledView.swift */; };
+ FCC2E4032004B72700CEB504 /* Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC2E4022004B72700CEB504 /* Util.swift */; };
+ FCC2E4052004B74000CEB504 /* AsyncUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC2E4042004B74000CEB504 /* AsyncUtil.swift */; };
+ FCC7651D201C7F8A007D190C /* libKit.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FCC7651C201C7F8A007D190C /* libKit.dylib */; };
+ FCC7651E201C80A5007D190C /* libKit.dylib in Embed Libraries */ = {isa = PBXBuildFile; fileRef = FCC7651C201C7F8A007D190C /* libKit.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ FC148CE420187F7800C349CA /* Embed Libraries */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ FCC7651E201C80A5007D190C /* libKit.dylib in Embed Libraries */,
+ );
+ name = "Embed Libraries";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 39284DB21FA5F207006F43E4 /* DocumentActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentActions.swift; sourceTree = "<group>"; };
+ 392ED9B21E5E4B03005C8435 /* ViewPrintManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ViewPrintManager.swift; path = LibreOfficeLight/ViewPrintManager.swift; sourceTree = SOURCE_ROOT; };
+ 3941EF06204B4C8900082486 /* unorc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = unorc; path = ../../workdir/CustomTarget/ios/resources/unorc; sourceTree = "<group>"; };
+ 3941EF07204B4C8900082486 /* fundamentalrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = fundamentalrc; path = ../../workdir/CustomTarget/ios/resources/fundamentalrc; sourceTree = "<group>"; };
+ 3941EF08204B4C8900082486 /* program */ = {isa = PBXFileReference; lastKnownFileType = folder; name = program; path = ../../workdir/CustomTarget/ios/resources/program; sourceTree = "<group>"; };
+ 3941EF09204B4C8900082486 /* services.rdb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = services.rdb; path = ../../workdir/CustomTarget/ios/resources/services.rdb; sourceTree = "<group>"; };
+ 3941EF0A204B4C8900082486 /* oovbaapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = oovbaapi.rdb; path = ../../workdir/CustomTarget/ios/resources/oovbaapi.rdb; sourceTree = "<group>"; };
+ 3941EF0B204B4C8900082486 /* registry */ = {isa = PBXFileReference; lastKnownFileType = folder; name = registry; path = ../../workdir/CustomTarget/ios/resources/registry; sourceTree = "<group>"; };
+ 3941EF0C204B4C8900082486 /* services */ = {isa = PBXFileReference; lastKnownFileType = folder; name = services; path = ../../workdir/CustomTarget/ios/resources/services; sourceTree = "<group>"; };
+ 3941EF0D204B4C8900082486 /* offapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = offapi.rdb; path = ../../workdir/CustomTarget/ios/resources/offapi.rdb; sourceTree = "<group>"; };
+ 3941EF0E204B4C8900082486 /* filter */ = {isa = PBXFileReference; lastKnownFileType = folder; name = filter; path = ../../workdir/CustomTarget/ios/resources/filter; sourceTree = "<group>"; };
+ 3941EF0F204B4C8900082486 /* rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rc; path = ../../workdir/CustomTarget/ios/resources/rc; sourceTree = "<group>"; };
+ 3941EF10204B4C8900082486 /* udkapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = udkapi.rdb; path = ../../workdir/CustomTarget/ios/resources/udkapi.rdb; sourceTree = "<group>"; };
+ 3941EF11204B4C8900082486 /* icudt62l.dat */ = {isa = PBXFileReference; lastKnownFileType = file; name = icudt62l.dat; path = ../../workdir/CustomTarget/ios/resources/icudt62l.dat; sourceTree = "<group>"; };
+ 3941EF12204B4C8900082486 /* welcome.odt */ = {isa = PBXFileReference; lastKnownFileType = file; name = welcome.odt; path = ../../workdir/CustomTarget/ios/resources/welcome.odt; sourceTree = "<group>"; };
+ 3941EF13204B4C8900082486 /* config */ = {isa = PBXFileReference; lastKnownFileType = folder; name = config; path = ../../workdir/CustomTarget/ios/resources/config; sourceTree = "<group>"; };
+ 3941EF14204B4C8900082486 /* share */ = {isa = PBXFileReference; lastKnownFileType = folder; name = share; path = ../../workdir/CustomTarget/ios/resources/share; sourceTree = "<group>"; };
+ 39503A6F1F94C4AC00F19C78 /* lokit-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "lokit-Bridging-Header.h"; sourceTree = "<group>"; };
+ 39514DFF2057DC55005599D0 /* shared */ = {isa = PBXFileReference; lastKnownFileType = folder; name = shared; path = ../../bridges/source/cpp_uno/shared; sourceTree = "<group>"; };
+ 39514E012057DC92005599D0 /* gcc3_ios */ = {isa = PBXFileReference; lastKnownFileType = folder; name = gcc3_ios; path = ../../bridges/source/cpp_uno/gcc3_ios; sourceTree = "<group>"; };
+ 39514E032057DCE7005599D0 /* gcc3_macosx_x86-64 */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "gcc3_macosx_x86-64"; path = "../../bridges/source/cpp_uno/gcc3_macosx_x86-64"; sourceTree = "<group>"; };
+ 39514E052057DD17005599D0 /* gcc3_linux_aarch64 */ = {isa = PBXFileReference; lastKnownFileType = folder; name = gcc3_linux_aarch64; path = ../../bridges/source/cpp_uno/gcc3_linux_aarch64; sourceTree = "<group>"; };
+ 39514E072057E4A8005599D0 /* inc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = inc; path = ../../bridges/inc; sourceTree = "<group>"; };
+ 396F92F61E7AE62400A28C82 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
+ 397275391E77D9F1006ACDCC /* LibreOfficeLight.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LibreOfficeLight.entitlements; sourceTree = "<group>"; };
+ 397868D71E59A3EA007F9248 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
+ 397E08FA1E597BD8001374E0 /* LibreOfficeLight.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LibreOfficeLight.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 397E08FD1E597BD8001374E0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = LibreOfficeLight/AppDelegate.swift; sourceTree = SOURCE_ROOT; };
+ 397E09021E597BD8001374E0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = "<group>"; };
+ 397E09071E597BD8001374E0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = LibreOfficeLight/Assets.xcassets; sourceTree = SOURCE_ROOT; };
+ 3992D8591E5B762A00BEA987 /* DocumentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DocumentController.swift; path = LibreOfficeLight/DocumentController.swift; sourceTree = SOURCE_ROOT; };
+ 399648461E5B87DC00E73E83 /* ViewProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ViewProperties.swift; path = LibreOfficeLight/ViewProperties.swift; sourceTree = SOURCE_ROOT; };
+ 39B092501E5F3DEA00682A59 /* LibreOfficeLight-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LibreOfficeLight-Prefix.pch"; sourceTree = "<group>"; };
+ 39B4245D2060FB2300347588 /* ucbhelper.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ucbhelper.cxx; path = ../../unotools/source/ucbhelper/ucbhelper.cxx; sourceTree = "<group>"; };
+ 39E950521FC9842000D82C49 /* source */ = {isa = PBXFileReference; lastKnownFileType = folder; name = source; path = ../source; sourceTree = "<group>"; };
+ 39EE81531FA644E800B73AB8 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 39EF4E2E1FA500C9001914AC /* PropertiesController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PropertiesController.swift; sourceTree = "<group>"; };
+ 39FD89E6204EBCB900E7179F /* exc_thrower.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exc_thrower.cxx; path = ../../cppuhelper/source/exc_thrower.cxx; sourceTree = "<group>"; };
+ FC31D01D2012F65500E7F402 /* DocumentHolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentHolder.swift; sourceTree = "<group>"; };
+ FC31D01F2012F6D300E7F402 /* RenderCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenderCache.swift; sourceTree = "<group>"; };
+ FC31D02A2013500E00E7F402 /* ButtonScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonScrollView.swift; sourceTree = "<group>"; };
+ FC31D02C2015DE1700E7F402 /* UIViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = "<group>"; };
+ FCAB1CB72009DB6900F1CC34 /* DocumentOverlaysView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentOverlaysView.swift; sourceTree = "<group>"; };
+ FCC2E3F62004A01400CEB504 /* Document.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Document.swift; sourceTree = "<group>"; };
+ FCC2E3F82004A01400CEB504 /* LibreOfficeKitWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibreOfficeKitWrapper.swift; sourceTree = "<group>"; };
+ FCC2E3F92004A01400CEB504 /* LOKitThread.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LOKitThread.swift; sourceTree = "<group>"; };
+ FCC2E3FE2004B59B00CEB504 /* DocumentTiledView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DocumentTiledView.swift; sourceTree = "<group>"; };
+ FCC2E4022004B72700CEB504 /* Util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Util.swift; sourceTree = "<group>"; };
+ FCC2E4042004B74000CEB504 /* AsyncUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncUtil.swift; sourceTree = "<group>"; };
+ FCC7651C201C7F8A007D190C /* libKit.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libKit.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 397E08F71E597BD8001374E0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ FCC7651D201C7F8A007D190C /* libKit.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 3911D89F1E5993600050D6BC /* Support files */ = {
+ isa = PBXGroup;
+ children = (
+ 39B092501E5F3DEA00682A59 /* LibreOfficeLight-Prefix.pch */,
+ 397275391E77D9F1006ACDCC /* LibreOfficeLight.entitlements */,
+ 397E09071E597BD8001374E0 /* Assets.xcassets */,
+ 396F92F61E7AE62400A28C82 /* Settings.bundle */,
+ );
+ name = "Support files";
+ path = LibreOfficeLight;
+ sourceTree = SOURCE_ROOT;
+ };
+ 3956B72D1FAB3DBF00BF5DE4 /* extra */ = {
+ isa = PBXGroup;
+ children = (
+ 39514E072057E4A8005599D0 /* inc */,
+ 39514E052057DD17005599D0 /* gcc3_linux_aarch64 */,
+ 39514E032057DCE7005599D0 /* gcc3_macosx_x86-64 */,
+ 39514E012057DC92005599D0 /* gcc3_ios */,
+ 39514DFF2057DC55005599D0 /* shared */,
+ 39FD89E6204EBCB900E7179F /* exc_thrower.cxx */,
+ 39B4245D2060FB2300347588 /* ucbhelper.cxx */,
+ 39E950521FC9842000D82C49 /* source */,
+ );
+ name = extra;
+ sourceTree = "<group>";
+ };
+ 3972753A1E77D9F7006ACDCC /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ FCC7651C201C7F8A007D190C /* libKit.dylib */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 397E08F11E597BD8001374E0 = {
+ isa = PBXGroup;
+ children = (
+ 3956B72D1FAB3DBF00BF5DE4 /* extra */,
+ 39B084E41E5F0B5200682A59 /* Resources */,
+ 3911D89F1E5993600050D6BC /* Support files */,
+ 397E08FC1E597BD8001374E0 /* LibreOfficeLight */,
+ 397E08FB1E597BD8001374E0 /* Products */,
+ 3972753A1E77D9F7006ACDCC /* Frameworks */,
+ );
+ sourceTree = "<group>";
+ };
+ 397E08FB1E597BD8001374E0 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 397E08FA1E597BD8001374E0 /* LibreOfficeLight.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 397E08FC1E597BD8001374E0 /* LibreOfficeLight */ = {
+ isa = PBXGroup;
+ children = (
+ FCC2E3F52004A01400CEB504 /* LOKit */,
+ 39EE81531FA644E800B73AB8 /* Info.plist */,
+ 39503A6F1F94C4AC00F19C78 /* lokit-Bridging-Header.h */,
+ 397E08FD1E597BD8001374E0 /* AppDelegate.swift */,
+ FC31D02A2013500E00E7F402 /* ButtonScrollView.swift */,
+ 3992D8591E5B762A00BEA987 /* DocumentController.swift */,
+ FCAB1CB72009DB6900F1CC34 /* DocumentOverlaysView.swift */,
+ FCC2E3FE2004B59B00CEB504 /* DocumentTiledView.swift */,
+ 39284DB21FA5F207006F43E4 /* DocumentActions.swift */,
+ 39EF4E2E1FA500C9001914AC /* PropertiesController.swift */,
+ FC31D02C2015DE1700E7F402 /* UIViewExtensions.swift */,
+ 392ED9B21E5E4B03005C8435 /* ViewPrintManager.swift */,
+ 399648461E5B87DC00E73E83 /* ViewProperties.swift */,
+ 397E09011E597BD8001374E0 /* Main.storyboard */,
+ 397868D81E59A3EA007F9248 /* LaunchScreen.xib */,
+ );
+ path = LibreOfficeLight;
+ sourceTree = SOURCE_ROOT;
+ };
+ 39B084E41E5F0B5200682A59 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 3941EF13204B4C8900082486 /* config */,
+ 3941EF0E204B4C8900082486 /* filter */,
+ 3941EF07204B4C8900082486 /* fundamentalrc */,
+ 3941EF11204B4C8900082486 /* icudt62l.dat */,
+ 3941EF0D204B4C8900082486 /* offapi.rdb */,
+ 3941EF0A204B4C8900082486 /* oovbaapi.rdb */,
+ 3941EF08204B4C8900082486 /* program */,
+ 3941EF0F204B4C8900082486 /* rc */,
+ 3941EF0B204B4C8900082486 /* registry */,
+ 3941EF0C204B4C8900082486 /* services */,
+ 3941EF09204B4C8900082486 /* services.rdb */,
+ 3941EF14204B4C8900082486 /* share */,
+ 3941EF10204B4C8900082486 /* udkapi.rdb */,
+ 3941EF06204B4C8900082486 /* unorc */,
+ 3941EF12204B4C8900082486 /* welcome.odt */,
+ );
+ name = Resources;
+ sourceTree = SOURCE_ROOT;
+ };
+ FCC2E3F52004A01400CEB504 /* LOKit */ = {
+ isa = PBXGroup;
+ children = (
+ FCC2E4042004B74000CEB504 /* AsyncUtil.swift */,
+ FCC2E3F62004A01400CEB504 /* Document.swift */,
+ FC31D01D2012F65500E7F402 /* DocumentHolder.swift */,
+ FCC2E3F82004A01400CEB504 /* LibreOfficeKitWrapper.swift */,
+ FCC2E3F92004A01400CEB504 /* LOKitThread.swift */,
+ FC31D01F2012F6D300E7F402 /* RenderCache.swift */,
+ FCC2E4022004B72700CEB504 /* Util.swift */,
+ );
+ path = LOKit;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 397E08F91E597BD8001374E0 /* LibreOfficeLight */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 397E09251E597BD8001374E0 /* Build configuration list for PBXNativeTarget "LibreOfficeLight" */;
+ buildPhases = (
+ FC148D13201C7A6600C349CA /* ShellScript */,
+ 397E08F61E597BD8001374E0 /* Sources */,
+ 397E08F71E597BD8001374E0 /* Frameworks */,
+ 397E08F81E597BD8001374E0 /* Resources */,
+ FC148CE420187F7800C349CA /* Embed Libraries */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = LibreOfficeLight;
+ productName = LibreOfficeLight;
+ productReference = 397E08FA1E597BD8001374E0 /* LibreOfficeLight.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 397E08F21E597BD8001374E0 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 0820;
+ LastUpgradeCheck = 0930;
+ ORGANIZATIONNAME = jani;
+ TargetAttributes = {
+ 397E08F91E597BD8001374E0 = {
+ CreatedOnToolsVersion = 8.2;
+ LastSwiftMigration = 0900;
+ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.ApplicationGroups.iOS = {
+ enabled = 0;
+ };
+ com.apple.Push = {
+ enabled = 0;
+ };
+ com.apple.iCloud = {
+ enabled = 1;
+ };
+ };
+ };
+ };
+ };
+ buildConfigurationList = 397E08F51E597BD8001374E0 /* Build configuration list for PBXProject "LibreOfficeLight" */;
+ compatibilityVersion = "Xcode 8.0";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 397E08F11E597BD8001374E0;
+ productRefGroup = 397E08FB1E597BD8001374E0 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 397E08F91E597BD8001374E0 /* LibreOfficeLight */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 397E08F81E597BD8001374E0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3941EF15204B4C8A00082486 /* unorc in Resources */,
+ 3941EF19204B4C8A00082486 /* oovbaapi.rdb in Resources */,
+ 3941EF1D204B4C8A00082486 /* filter in Resources */,
+ 397E09081E597BD8001374E0 /* Assets.xcassets in Resources */,
+ 397868D61E59A3EA007F9248 /* LaunchScreen.xib in Resources */,
+ 39514E002057DC55005599D0 /* shared in Resources */,
+ 3941EF1A204B4C8A00082486 /* registry in Resources */,
+ 3941EF18204B4C8A00082486 /* services.rdb in Resources */,
+ 3941EF1C204B4C8A00082486 /* offapi.rdb in Resources */,
+ 3941EF22204B4C8A00082486 /* config in Resources */,
+ 396F92F71E7AE62400A28C82 /* Settings.bundle in Resources */,
+ 3941EF1E204B4C8A00082486 /* rc in Resources */,
+ 3941EF23204B4C8A00082486 /* share in Resources */,
+ 3941EF1B204B4C8A00082486 /* services in Resources */,
+ 3941EF21204B4C8A00082486 /* welcome.odt in Resources */,
+ 397E09031E597BD8001374E0 /* Main.storyboard in Resources */,
+ 3941EF20204B4C8A00082486 /* icudt62l.dat in Resources */,
+ 3941EF16204B4C8A00082486 /* fundamentalrc in Resources */,
+ 39514E082057E4A8005599D0 /* inc in Resources */,
+ 3941EF1F204B4C8A00082486 /* udkapi.rdb in Resources */,
+ 3941EF17204B4C8A00082486 /* program in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ FC148D13201C7A6600C349CA /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/bash;
+ shellScript = "\nGEN=$PROJECT_DIR/../../workdir/CustomTarget/ios/$CONFIGURATION\\_$ARCHS/libKit.dylib\ncp $GEN $TARGET_BUILD_DIR/libKit.dylib\n\n\n\n\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 397E08F61E597BD8001374E0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ FCC2E4032004B72700CEB504 /* Util.swift in Sources */,
+ 392ED9B31E5E4B03005C8435 /* ViewPrintManager.swift in Sources */,
+ FC31D01E2012F65500E7F402 /* DocumentHolder.swift in Sources */,
+ FCAB1CB82009DB6900F1CC34 /* DocumentOverlaysView.swift in Sources */,
+ FC31D0202012F6D300E7F402 /* RenderCache.swift in Sources */,
+ 399648471E5B87DC00E73E83 /* ViewProperties.swift in Sources */,
+ FCC2E3FC2004A01500CEB504 /* LibreOfficeKitWrapper.swift in Sources */,
+ 39284DB31FA5F207006F43E4 /* DocumentActions.swift in Sources */,
+ 3992D85A1E5B762A00BEA987 /* DocumentController.swift in Sources */,
+ FCC2E3FD2004A01500CEB504 /* LOKitThread.swift in Sources */,
+ 397E08FE1E597BD8001374E0 /* AppDelegate.swift in Sources */,
+ FC31D02B2013500E00E7F402 /* ButtonScrollView.swift in Sources */,
+ FCC2E3FA2004A01500CEB504 /* Document.swift in Sources */,
+ FCC2E3FF2004B59B00CEB504 /* DocumentTiledView.swift in Sources */,
+ FC31D02D2015DE1700E7F402 /* UIViewExtensions.swift in Sources */,
+ FCC2E4052004B74000CEB504 /* AsyncUtil.swift in Sources */,
+ 39EF4E2F1FA500C9001914AC /* PropertiesController.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 397868D81E59A3EA007F9248 /* LaunchScreen.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 397868D71E59A3EA007F9248 /* en */,
+ );
+ name = LaunchScreen.xib;
+ path = LibreOfficeLight;
+ sourceTree = SOURCE_ROOT;
+ };
+ 397E09011E597BD8001374E0 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 397E09021E597BD8001374E0 /* en */,
+ );
+ name = Main.storyboard;
+ path = LibreOfficeLight;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 397E09231E597BD8001374E0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_OPTIMIZATION_PROFILE_FILE = "$(SRCROOT)/../../workdir/CustomTarget/ios/$(PROJECT_NAME).profdata";
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_BITCODE = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "$(inherited)";
+ IPHONEOS_DEPLOYMENT_TARGET = 11.3;
+ LD_MAP_FILE_PATH = "";
+ LIBRARY_SEARCH_PATHS = "$PROJECT_DIR/../../workdir/CustomTarget/ios/debug/**";
+ MACH_O_TYPE = mh_execute;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OBJC_BRIDGING_HEADER = "lokit-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_SWIFT3_OBJC_INFERENCE = Default;
+ SWIFT_VERSION = 4.0;
+ SYMROOT = ../../workdir/CustomTarget/ios/build;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALID_ARCHS = "arm64 x86_64";
+ };
+ name = Debug;
+ };
+ 397E09241E597BD8001374E0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_OPTIMIZATION_PROFILE_FILE = "$(SRCROOT)/../../workdir/CustomTarget/ios/$(PROJECT_NAME).profdata";
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_BITCODE = NO;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "$(inherited)";
+ IPHONEOS_DEPLOYMENT_TARGET = 11.3;
+ LD_MAP_FILE_PATH = "";
+ LIBRARY_SEARCH_PATHS = "$PROJECT_DIR/../../workdir/CustomTarget/ios/release/**";
+ MACH_O_TYPE = mh_execute;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_OBJC_BRIDGING_HEADER = "lokit-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ SWIFT_SWIFT3_OBJC_INFERENCE = Default;
+ SWIFT_VERSION = 4.0;
+ SYMROOT = ../../workdir/CustomTarget/ios/build;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ VALID_ARCHS = "arm64 x86_64";
+ };
+ name = Release;
+ };
+ 397E09261E597BD8001374E0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
+ CLANG_WARN_INFINITE_RECURSION = NO;
+ CODE_SIGN_ENTITLEMENTS = LibreOfficeLight/LibreOfficeLight.entitlements;
+ DEVELOPMENT_TEAM = J4FQ687VJK;
+ ENABLE_TESTABILITY = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "LibreOfficeLight/LibreOfficeLight-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "IOS=1",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/../../include",
+ );
+ INFOPLIST_FILE = LibreOfficeLight/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = "";
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = org.libreoffice.ios.LibreOfficeLight;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "LibreOfficeLight/lokit-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_SWIFT3_OBJC_INFERENCE = Off;
+ SWIFT_VERSION = 4.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALID_ARCHS = "arm64 x86_64";
+ };
+ name = Debug;
+ };
+ 397E09271E597BD8001374E0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
+ CLANG_WARN_INFINITE_RECURSION = NO;
+ CODE_SIGN_ENTITLEMENTS = LibreOfficeLight/LibreOfficeLight.entitlements;
+ COPY_PHASE_STRIP = YES;
+ DEVELOPMENT_TEAM = J4FQ687VJK;
+ ENABLE_TESTABILITY = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "LibreOfficeLight/LibreOfficeLight-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "IOS=1";
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/../../include",
+ );
+ INFOPLIST_FILE = LibreOfficeLight/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = "";
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = org.libreoffice.ios.LibreOfficeLight;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "LibreOfficeLight/lokit-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ SWIFT_SWIFT3_OBJC_INFERENCE = Off;
+ SWIFT_VERSION = 4.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALID_ARCHS = "arm64 x86_64";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 397E08F51E597BD8001374E0 /* Build configuration list for PBXProject "LibreOfficeLight" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 397E09231E597BD8001374E0 /* Debug */,
+ 397E09241E597BD8001374E0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+ 397E09251E597BD8001374E0 /* Build configuration list for PBXNativeTarget "LibreOfficeLight" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 397E09261E597BD8001374E0 /* Debug */,
+ 397E09271E597BD8001374E0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 397E08F21E597BD8001374E0 /* Project object */;
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Debug.xcscheme b/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Debug.xcscheme
new file mode 100644
index 000000000..450c96e3b
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Debug.xcscheme
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0930"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </TestAction>
+ <LaunchAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ debugServiceExtension = "internal"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <EnvironmentVariables>
+ <EnvironmentVariable
+ key = "SAL_LOG"
+ value = "+INFO+WARN"
+ isEnabled = "YES">
+ </EnvironmentVariable>
+ </EnvironmentVariables>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ buildConfiguration = "Debug"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Release.xcscheme b/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Release.xcscheme
new file mode 100644
index 000000000..9c3d62de8
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight.xcodeproj/xcshareddata/xcschemes/Release.xcscheme
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0930"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </TestAction>
+ <LaunchAction
+ buildConfiguration = "Release"
+ selectedDebuggerIdentifier = ""
+ selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ debugServiceExtension = "internal"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ buildConfiguration = "Release"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "397E08F91E597BD8001374E0"
+ BuildableName = "LibreOfficeLight.app"
+ BlueprintName = "LibreOfficeLight"
+ ReferencedContainer = "container:LibreOfficeLight.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Release">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/AppDelegate.swift b/ios/LibreOfficeLight/LibreOfficeLight/AppDelegate.swift
new file mode 100644
index 000000000..f0b5f6bd3
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/AppDelegate.swift
@@ -0,0 +1,117 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+import UIKit
+import Foundation
+
+
+// AppDelegate is a Delegate class that receives calls from the iOS
+// kernel, and theirby allows stop/start/sleep of the application
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate
+{
+ var window: UIWindow?
+
+
+
+ // sent when clicking on an OO document in another app
+ // allowing this app to handle the document.
+ // remark if the app is not started it will be started first
+ func application(_ app: UIApplication,
+ open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:])
+ -> Bool
+ {
+ let document = window?.rootViewController?.childViewControllers[0] as! DocumentController
+ document.doOpen(url)
+ return true
+ }
+
+
+
+ // this function is called when the app is first started (loaded from EEProm)
+ // it initializes the LO system and prepares for a normal run
+ func application(_ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions:
+ [UIApplicationLaunchOptionsKey: Any]?)
+ -> Bool
+ {
+ // Get version info
+ let appInfo = Bundle.main.infoDictionary! as Dictionary<String,AnyObject>
+ let applicationVersion = (appInfo["CFBundleShortVersionString"] as! String) + "." +
+ (appInfo["CFBundleVersion"] as! String)
+
+ // Add version string to setting
+ let defaults = UserDefaults.standard
+ defaults.set(applicationVersion, forKey: "application_version")
+ defaults.synchronize()
+
+ // start LibreOfficeKit
+ let _ = LOKitThread.instance
+
+ return true
+ }
+
+
+
+ // Sent when the application is about to move from active to inactive state.
+ // This can occur for certain types of temporary interruptions
+ // (such as an incoming phone call or SMS message)
+ // or when the user quits the application and it begins the transition
+ // jto the background state.
+ // Use this method to pause ongoing tasks, disable timers,
+ // and invalidate graphics rendering callbacks.
+ func applicationWillResignActive(_ application: UIApplication)
+ {
+ // NOT used in this App
+ }
+
+
+
+ // Sent when the application enters background (hipernating)
+ // Use this method to release shared resources, save user data, invalidate timers,
+ // and store enough application state information to restore your application
+ // to its current state jin case it is terminated later.
+ // If your application supports background execution,
+ // this method is called instead of applicationWillTerminate: when the user quits.
+ func applicationDidEnterBackground(_ application: UIApplication)
+ {
+ let document = window?.rootViewController?.childViewControllers[0]
+ as! DocumentController
+ document.Hipernate()
+ }
+
+
+
+ // Sent before the application reenters foreground (hipernating -> active)
+ // Restart timers, tasks as well as graphic rendering
+ func applicationWillEnterForeground(_ application: UIApplication)
+ {
+ let document = window?.rootViewController?.childViewControllers[0] as! DocumentController
+ document.LeaveHipernate()
+ }
+
+
+
+ // Sent after the application reenters foreground (hipernating -> active)
+ // Restart timers, tasks as well as graphic rendering
+ func applicationDidBecomeActive(_ application: UIApplication)
+ {
+ // NOT used in this App
+ }
+
+
+
+ // Sent when the application is about to terminate. Save data if appropriate.
+ // See also applicationDidEnterBackground:.
+ // Saves changes in the application's managed object context before the application terminates.
+ func applicationWillTerminate(_ application: UIApplication)
+ {
+ let document = window?.rootViewController?.childViewControllers[0] as! DocumentController
+ document.Hipernate()
+ }
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..b179c2c53
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,116 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "filename" : "LibreOffice-40.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "filename" : "LibreOffice-60.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "LibreOffice-58.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "29x29",
+ "filename" : "LibreOffice-87.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "LibreOffice-80.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "40x40",
+ "filename" : "LibreOffice-120.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "LibreOffice-120.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "60x60",
+ "filename" : "LibreOffice-180.png",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "filename" : "LibreOffice-20.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "filename" : "LibreOffice-40.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "LibreOffice-29.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "LibreOffice-58.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "LibreOffice-40.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "LibreOffice-80.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "LibreOffice-76.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "LibreOffice-152.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "83.5x83.5",
+ "filename" : "LibreOffice-167.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "LibreOffice-1024.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-1024.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-1024.png
new file mode 100644
index 000000000..e25eb6bdd
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-1024.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-120.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-120.png
new file mode 100644
index 000000000..49a7a1070
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-120.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-152.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-152.png
new file mode 100644
index 000000000..9a204a930
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-152.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-167.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-167.png
new file mode 100644
index 000000000..ef0033f9a
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-167.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-180.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-180.png
new file mode 100644
index 000000000..2fdcb30dc
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-180.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-20.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-20.png
new file mode 100644
index 000000000..ba82eb87b
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-20.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-29.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-29.png
new file mode 100644
index 000000000..5a03ed3f4
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-29.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-40.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-40.png
new file mode 100644
index 000000000..1fefbff4b
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-40.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-58.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-58.png
new file mode 100644
index 000000000..cd6cf1338
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-58.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-60.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-60.png
new file mode 100644
index 000000000..00774322c
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-60.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-76.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-76.png
new file mode 100644
index 000000000..879629fc8
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-76.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-80.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-80.png
new file mode 100644
index 000000000..1ae49c48c
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-80.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-87.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-87.png
new file mode 100644
index 000000000..679f6abc0
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-87.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/Contents.json
new file mode 100644
index 000000000..cc9fb3d1a
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x",
+ "filename" : "back.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x",
+ "filename" : "back@2x.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x",
+ "filename" : "back@3x.png"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back.png
new file mode 100644
index 000000000..0b9776a64
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@2x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@2x.png
new file mode 100644
index 000000000..6e7c3995d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@2x.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@3x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@3x.png
new file mode 100644
index 000000000..e66980cdd
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@3x.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/Contents.json
new file mode 100644
index 000000000..da4a164c9
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/Contents.json
new file mode 100644
index 000000000..885f35756
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "drawing-template.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/drawing-template.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/drawing-template.icns
new file mode 100644
index 000000000..64c373eca
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/drawing-template.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/Contents.json
new file mode 100644
index 000000000..3e1c14b1b
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "drawing.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/drawing.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/drawing.icns
new file mode 100644
index 000000000..d179d041a
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/drawing.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/Contents.json
new file mode 100644
index 000000000..816e9aa12
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "empty-document.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/empty-document.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/empty-document.ico
new file mode 100644
index 000000000..ec11e8fe5
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/empty-document.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/Contents.json
new file mode 100644
index 000000000..8d4ccc066
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "empty-template.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/empty-template.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/empty-template.ico
new file mode 100644
index 000000000..ec11e8fe5
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/empty-template.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/Contents.json
new file mode 100644
index 000000000..f35fc2be7
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "extension.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/extension.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/extension.icns
new file mode 100644
index 000000000..cec1b92c3
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/extension.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/Contents.json
new file mode 100644
index 000000000..dec8005ed
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "formula.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/formula.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/formula.icns
new file mode 100644
index 000000000..f6dc58809
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/formula.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/Contents.json
new file mode 100644
index 000000000..1fb866b12
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "main.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/main.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/main.icns
new file mode 100644
index 000000000..c3e1bf693
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/main.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/Contents.json
new file mode 100644
index 000000000..1b65ad0ed
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "master-document.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/master-document.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/master-document.icns
new file mode 100644
index 000000000..4b0cf1bb7
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/master-document.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/Contents.json
new file mode 100644
index 000000000..5f270e1fe
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-database.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/oasis-database.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/oasis-database.icns
new file mode 100644
index 000000000..e523fdd9d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/oasis-database.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/Contents.json
new file mode 100644
index 000000000..c2c2cc129
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-drawing-template.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/oasis-drawing-template.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/oasis-drawing-template.ico
new file mode 100644
index 000000000..9991270a5
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/oasis-drawing-template.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/Contents.json
new file mode 100644
index 000000000..74ba17140
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-drawing.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/oasis-drawing.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/oasis-drawing.icns
new file mode 100644
index 000000000..64563d257
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/oasis-drawing.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/Contents.json
new file mode 100644
index 000000000..19236e87f
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-formula.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/oasis-formula.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/oasis-formula.ico
new file mode 100644
index 000000000..07b3e8ecf
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/oasis-formula.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/Contents.json
new file mode 100644
index 000000000..47b7fb7ef
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-master-document-template.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/oasis-master-document-template.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/oasis-master-document-template.icns
new file mode 100644
index 000000000..9115dfc4b
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document-template.dataset/oasis-master-document-template.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/Contents.json
new file mode 100644
index 000000000..5043c1477
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-master-document.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/oasis-master-document.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/oasis-master-document.ico
new file mode 100644
index 000000000..0ac9681b1
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/oasis-master-document.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/Contents.json
new file mode 100644
index 000000000..0f5874081
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-presentation-template.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/oasis-presentation-template.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/oasis-presentation-template.icns
new file mode 100644
index 000000000..6bf52a184
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/oasis-presentation-template.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/Contents.json
new file mode 100644
index 000000000..98bd94f4d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-presentation.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/oasis-presentation.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/oasis-presentation.ico
new file mode 100644
index 000000000..0845cad87
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/oasis-presentation.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/Contents.json
new file mode 100644
index 000000000..97df63130
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-spreadsheet-template.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/oasis-spreadsheet-template.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/oasis-spreadsheet-template.icns
new file mode 100644
index 000000000..d21737853
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/oasis-spreadsheet-template.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/Contents.json
new file mode 100644
index 000000000..189679bfc
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-spreadsheet.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/oasis-spreadsheet.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/oasis-spreadsheet.icns
new file mode 100644
index 000000000..95cc98b34
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/oasis-spreadsheet.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/Contents.json
new file mode 100644
index 000000000..ead3ca01d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-text-template.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/oasis-text-template.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/oasis-text-template.ico
new file mode 100644
index 000000000..71136e778
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/oasis-text-template.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/Contents.json
new file mode 100644
index 000000000..36818aec0
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-text.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/oasis-text.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/oasis-text.ico
new file mode 100644
index 000000000..70210b0ec
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/oasis-text.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/Contents.json
new file mode 100644
index 000000000..59b4f2d07
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "oasis-web-template.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/oasis-web-template.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/oasis-web-template.icns
new file mode 100644
index 000000000..06fcd5ad1
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/oasis-web-template.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/Contents.json
new file mode 100644
index 000000000..26efddc8e
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "open.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/open.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/open.ico
new file mode 100644
index 000000000..ec11e8fe5
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/open.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/Contents.json
new file mode 100644
index 000000000..1cf424888
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "presentation-template.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/presentation-template.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/presentation-template.ico
new file mode 100644
index 000000000..b24847495
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/presentation-template.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/Contents.json
new file mode 100644
index 000000000..48727c0d5
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "presentation.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/presentation.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/presentation.ico
new file mode 100644
index 000000000..0845cad87
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/presentation.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/Contents.json
new file mode 100644
index 000000000..30042d0d9
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "soffice.ico"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/soffice.ico b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/soffice.ico
new file mode 100644
index 000000000..ec11e8fe5
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/soffice.ico
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/Contents.json
new file mode 100644
index 000000000..01557a908
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "spreadsheet-template.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/spreadsheet-template.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/spreadsheet-template.icns
new file mode 100644
index 000000000..f527a14b7
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/spreadsheet-template.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/Contents.json
new file mode 100644
index 000000000..87e81d269
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "spreadsheet.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/spreadsheet.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/spreadsheet.icns
new file mode 100644
index 000000000..9d61c699c
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/spreadsheet.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/Contents.json
new file mode 100644
index 000000000..c5cbe2c9c
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "text-template.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/text-template.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/text-template.icns
new file mode 100644
index 000000000..accd48b9b
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/text-template.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/Contents.json
new file mode 100644
index 000000000..3fd87b588
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "data" : [
+ {
+ "idiom" : "universal",
+ "filename" : "text.icns"
+ }
+ ]
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/text.icns b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/text.icns
new file mode 100644
index 000000000..9b7a301ee
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/text.icns
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/Contents.json
new file mode 100644
index 000000000..1f910096d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x",
+ "filename" : "intro.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x",
+ "filename" : "intro.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x",
+ "filename" : "intro.png"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/intro.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/intro.png
new file mode 100644
index 000000000..d27f8858d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/intro.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/Contents.json b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/Contents.json
new file mode 100644
index 000000000..da2ac2bbd
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x",
+ "filename" : "menu.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x",
+ "filename" : "menu@2x.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x",
+ "filename" : "menu@3x.png"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu.png
new file mode 100644
index 000000000..fe97b0cfe
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@2x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@2x.png
new file mode 100644
index 000000000..f5e9a1597
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@2x.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@3x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@3x.png
new file mode 100644
index 000000000..9f00717fe
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@3x.png
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/ButtonScrollView.swift b/ios/LibreOfficeLight/LibreOfficeLight/ButtonScrollView.swift
new file mode 100644
index 000000000..615c145fe
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/ButtonScrollView.swift
@@ -0,0 +1,145 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+import UIKit
+
+/// Scrollable list of buttons.
+/// Kind of like a tab bar, but doesn't maintain or switch between views, just calls back on click
+open class ButtonScrollView: UIScrollView
+{
+ var buttonList: ButtonList? = nil
+
+ var buttonClickedCallback: ( (Int) -> () )? = nil
+
+ var selectedIndex: Int?
+ {
+ get {
+ return buttonList?.selectedIndex
+ }
+ set {
+ buttonList?.selectedIndex = selectedIndex
+ }
+ }
+
+ public override init(frame: CGRect)
+ {
+ super.init(frame: frame)
+ }
+
+ public required init?(coder aDecoder: NSCoder)
+ {
+ super.init(coder: aDecoder)
+ }
+
+ public func setButtonLabels(labels: [String])
+ {
+ if let bl = buttonList
+ {
+ bl.removeFromSuperview()
+ }
+ let bl = ButtonList(frame: CGRect(x:0, y:0, width: self.frame.width, height:44),
+ labels: labels,
+ owner: self)
+ self.addSubview(bl)
+ self.contentSize = bl.frame.size
+ self.buttonList = bl
+ }
+}
+
+/// Horizontally laid out buttons, living within the owned scroll view
+open class ButtonList: UIView
+{
+ let labels: [String]
+ let gap: CGFloat = 10.0
+ let topGap: CGFloat = 8
+ weak var owner: ButtonScrollView? = nil
+
+ var buttonBackground = UIColor(white: 0.6, alpha: 1)
+ var selectedButtonBackground = UIColor.white
+
+ var selectedIndex: Int? = 0
+ {
+ didSet {
+ runOnMain {
+ self.highlightSelectedIndex()
+ }
+ }
+ }
+
+ public init(frame: CGRect, labels: [String], owner: ButtonScrollView)
+ {
+ self.labels = labels
+ self.owner = owner
+ super.init(frame: frame)
+ self.backgroundColor = UIColor(white: 0.9, alpha: 1)
+
+ var idx = 0
+ for label in labels
+ {
+ let b = UIButton(type: .custom)
+ b.setTitle(label, for: .normal)
+ b.backgroundColor = buttonBackground
+ b.contentEdgeInsets = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)
+ b.layer.cornerRadius = 4
+ b.tag = idx
+ b.addTarget(self, action: #selector(buttonTapped), for: UIControlEvents.touchUpInside)
+ self.addSubview(b)
+ idx += 1
+ }
+ self.layoutSubviews()
+ }
+
+ @objc func buttonTapped(sender: UIButton, forEvent event: UIEvent)
+ {
+ let idx = sender.tag
+ owner?.buttonClickedCallback?(idx)
+ self.selectedIndex = idx
+ }
+
+ public required init?(coder aDecoder: NSCoder)
+ {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ public var buttons: [UIButton]
+ {
+ return self.subviews.compactMap({ $0 as? UIButton })
+ }
+
+ open override func layoutSubviews()
+ {
+
+ var x: CGFloat = gap
+ for button in buttons
+ {
+ button.sizeToFit()
+ let s = button.frame.size
+ button.frame = CGRect(x: x, y: topGap, width: s.width, height: s.height)
+ x = x + (s.width + gap)
+ }
+ highlightSelectedIndex()
+ self.frame = CGRect(x:0, y: 0, width: x, height: self.frame.height)
+ }
+
+ open func highlightSelectedIndex()
+ {
+ for (index, button) in buttons.enumerated()
+ {
+ if (index == selectedIndex)
+ {
+ button.backgroundColor = selectedButtonBackground
+ button.setTitleColor(.black, for: .normal)
+ }
+ else
+ {
+ button.backgroundColor = buttonBackground
+ button.setTitleColor(.white, for: .normal)
+ }
+
+ }
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/DocumentActions.swift b/ios/LibreOfficeLight/LibreOfficeLight/DocumentActions.swift
new file mode 100644
index 000000000..dddb3b22d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/DocumentActions.swift
@@ -0,0 +1,75 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+import UIKit
+
+
+
+// DocumentActions is the main menu popover started from DocumentController
+// it allows the user to invoke global actions and delegates the processing
+// back to the DocumentController
+class DocumentActions: UITableViewController
+{
+ // Pointer to callback class (in reality instance of DocumentController)
+ var delegate : MenuDelegate?
+
+
+
+ // set by DocumentController before invoking the menu
+ // the variable is used to control which menu entries are active
+ var isDocActive : Bool = false
+
+
+
+ // Reference to instances of the buttons
+ @IBOutlet weak var buttonOpen: UIButton!
+ @IBOutlet weak var buttonProperties: UIButton!
+ @IBOutlet weak var buttonSave: UIButton!
+ @IBOutlet weak var buttonClose: UIButton!
+ @IBOutlet weak var buttonSaveAs: UIButton!
+ @IBOutlet weak var buttonSaveAsPDF: UIButton!
+ @IBOutlet weak var buttonPrint: UIButton!
+
+
+
+ // called once controller is loaded
+ override func viewDidLoad()
+ {
+ super.viewDidLoad()
+
+ // Some menu entries are only active when a document is loaded
+ buttonSave.isEnabled = isDocActive
+ buttonProperties.isEnabled = isDocActive
+ buttonClose.isEnabled = isDocActive
+ buttonSaveAs.isEnabled = isDocActive
+ buttonSaveAsPDF.isEnabled = isDocActive
+ buttonPrint.isEnabled = isDocActive
+ }
+
+
+
+ // Called when user click on a menu entry (all entries goes here)
+ // see storyboard Document actions scene for details
+ @IBAction func actionMenuSelect(_ sender: UIButton)
+ {
+ // make popover go away, when this function returns
+ dismiss(animated: false)
+
+ // inform DocumentController about the selected entry
+ delegate?.actionMenuSelected(sender.tag)
+ }
+}
+
+
+
+// Protocol for action popover callback
+protocol MenuDelegate
+{
+ // inform delegate about selected menu entry
+ func actionMenuSelected(_ tag : Int)
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/DocumentController.swift b/ios/LibreOfficeLight/LibreOfficeLight/DocumentController.swift
new file mode 100644
index 000000000..af192249b
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/DocumentController.swift
@@ -0,0 +1,598 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+import UIKit
+
+
+// DocumentController is the main viewer in the app, it displays the selected
+// documents and holds a top entry to view the properties as well as a normal
+// menu to handle global actions
+// It is a delegate class to receive Menu events as well as file handling events
+class DocumentController: UIViewController, MenuDelegate, UIDocumentBrowserViewControllerDelegate
+{
+ var document: DocumentHolder? = nil
+
+ var documentView: DocumentTiledView? = nil
+ var documentOverlaysView: DocumentOverlaysView? = nil
+
+ // *** Handling of DocumentController
+ // this is normal functions every controller must implement
+
+
+ // holds known document types
+ var KnownDocumentTypes : [String] = []
+
+ var zeroInsets: UIEdgeInsets = .zero
+
+ @IBOutlet weak var scrollView: UIScrollView!
+ @IBOutlet weak var mask: UIView!
+ @IBOutlet weak var progressBar: UIProgressView!
+ @IBOutlet weak var searchBar: UISearchBar!
+ @IBOutlet weak var buttonScrollView: ButtonScrollView!
+
+ deinit
+ {
+ NotificationCenter.default.removeObserver(self)
+ }
+
+ // called once controller is loaded
+ override func viewDidLoad()
+ {
+ super.viewDidLoad()
+
+ // loading known document types, so we can use them for the open call
+ let path = Bundle.main.path(forResource: "Info", ofType: "plist")
+ let plist = NSDictionary(contentsOfFile: path!)
+ for dict in (plist!.object(forKey: "UTExportedTypeDeclarations") as! [NSDictionary]) +
+ (plist!.object(forKey: "UTImportedTypeDeclarations") as! [NSDictionary]) {
+ let x = ((dict["UTTypeTagSpecification"] as! NSDictionary)["public.filename-extension"] as! NSArray)
+ KnownDocumentTypes.append( x[0] as! String )
+ }
+ LOKitThread.instance.progressDelegate = self
+ }
+
+ override func viewWillAppear(_ animated: Bool)
+ {
+ super.viewWillAppear(animated)
+ registerKeyboardNotifications()
+ }
+
+ override func viewDidAppear(_ animated: Bool)
+ {
+ super.viewDidAppear(animated)
+
+ // Always load the 'welcome' file, as per the android app
+ let res = Bundle.main.url(forResource: "welcome", withExtension: "odt")
+
+ // uncomment for test data in resources until the doc picker works properly
+ //let res = Bundle.main.url(forResource: "testdata/2", withExtension: "xlsx")
+
+ if let exampleDoc = res
+ {
+ self.doOpen(exampleDoc)
+ }
+ }
+
+ // called when there is a memory constraint
+ override func didReceiveMemoryWarning()
+ {
+ super.didReceiveMemoryWarning()
+ // not used in this App
+ }
+
+ @IBAction func searchIconTapped(_ sender: Any)
+ {
+ searchBar.isHidden = !searchBar.isHidden
+ if (!searchBar.isHidden)
+ {
+ searchBar.becomeFirstResponder()
+ }
+ }
+
+
+ // *** Handling of Background (hipernate)
+ // iOS is not true multitasking, only 1 app can be active (foreground) at any time,
+ // therefore apps frequently are moved to the background.
+ // background really means hipernate by terminating all threads and solely keep the
+ // data
+
+
+
+ // Moving to hipernate
+ public func Hipernate() -> Void
+ {
+ //BridgeLOkit_Hipernate() // FIXME
+ }
+
+
+
+ // Moving back to foreground
+ public func LeaveHipernate() -> Void
+ {
+ //BridgeLOkit_LeaveHipernate() // FIXME
+ }
+
+
+
+ // *** handling of PropertiesController
+ // The PropertiesController is a left sidebar, that will scroll in when activated
+ // The Controller handles manipulation of properties in the document
+
+
+
+ // Activate/Deactivate PropertiesController (from navigationController, see storyboard)
+ @IBAction func doProperties(_ sender: UIBarButtonItem)
+ {
+ // Check if deactivation
+ if (sender.tag == 99) {
+ // Deactivate
+
+ // Mark it as deactivated (it stays loaded)
+ sender.tag = 0;
+
+ // get handle of PropertiesController
+ let viewMenuBack : UIView = view.subviews.last!
+
+ // Blend out sidebar
+ UIView.animate(withDuration: 0.3, animations: { () -> Void in
+ var frameMenu : CGRect = viewMenuBack.frame
+ frameMenu.origin.x = -1 * UIScreen.main.bounds.size.width
+ viewMenuBack.frame = frameMenu
+ viewMenuBack.layoutIfNeeded()
+ viewMenuBack.backgroundColor = UIColor.clear
+ }, completion: { (finished) -> Void in
+ viewMenuBack.removeFromSuperview()
+ })
+ }
+ else {
+ // Activate
+
+ // Mark as activated
+ sender.isEnabled = false
+ sender.tag = 99
+
+ // make instance of PropertiesController
+ let prop : PropertiesController = self.storyboard!.instantiateViewController(
+ withIdentifier: "PropertiesController") as! PropertiesController
+ view.addSubview(prop.view)
+ addChildViewController(prop)
+ prop.view.layoutIfNeeded()
+ prop.view.frame=CGRect(x: 0 - UIScreen.main.bounds.size.width,
+ y: 0,
+ width: UIScreen.main.bounds.size.width,
+ height: UIScreen.main.bounds.size.height);
+
+ // Blend in sidebar
+ UIView.animate(withDuration: 0.3, animations: { () -> Void in
+ prop.view.frame=CGRect(x: 0,
+ y: 0,
+ width: UIScreen.main.bounds.size.width,
+ height: UIScreen.main.bounds.size.height);
+ sender.isEnabled = true
+ }, completion:nil)
+ }
+ }
+
+
+
+ // *** Handling of menu popover
+ // the menu contains all global functions and use seque/delegate
+
+
+
+ var currentDocumentName : String? = nil
+
+
+
+ // Last stop before displaying popover
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?)
+ {
+ // "showActions" is the name of the popover menu, see storyboard
+ if segue.identifier == "showActions" {
+ let vc = segue.destination as! DocumentActions
+ vc.delegate = self
+ vc.isDocActive = (currentDocumentName != nil)
+ }
+ }
+
+
+
+ // Delegate call from menu (see protocol MenuDelegate)
+ func actionMenuSelected(_ tag : Int)
+ {
+ // a tag can sadly enough only be a number and not a string,
+ // whenever adding a menu entry, it (of course) needs to be added
+ // to the Document actions scene in storyboard and assigned a tag number
+ // the tag number must be repeated in the following switch
+ // BE CAREFUL to keep the tags synchronized (manually)
+ switch tag
+ {
+ case 1: // Open...
+ startOpenDocument()
+
+ case 2: // Properties
+ showProperties()
+
+ case 3: // Save
+ doSave()
+
+ case 4: // Close...
+ doClose()
+
+ case 5: // Save as...
+ doSaveAs()
+
+ case 6: // Save as PDF...
+ doSaveAsPDF()
+
+ case 7: // Print...
+ startPrint()
+
+ default: // should not happen
+ print("unknown menu" + String(tag))
+ }
+ }
+
+
+
+ // *** handling of menu actions
+ // This is the real base of the application
+
+ var openMenu : UIDocumentBrowserViewController? = nil
+
+ // Load document into LibreOfficeKit and present it
+ internal func startOpenDocument()
+ {
+ openMenu = UIDocumentBrowserViewController()
+ openMenu?.allowsDocumentCreation = true
+ openMenu?.browserUserInterfaceStyle = UIDocumentBrowserViewController.BrowserUserInterfaceStyle.dark
+ openMenu?.delegate = self
+ self.present(openMenu!, animated: true, completion: nil)
+ }
+
+
+
+ // Show document properties (new overloaded page)
+ internal func showProperties()
+ {
+ //FIXME
+ print("menu Properties to be done")
+ }
+
+
+
+ // Save current document
+ internal func doSave()
+ {
+ //FIXME
+ print("menu Save to be done")
+ }
+
+
+
+ // Close current document (without saving)
+ internal func doClose()
+ {
+ //FIXME
+ print("menu Close to be done")
+ }
+
+
+
+ // make a copy of current document, and save
+ internal func doSaveAs()
+ {
+ //FIXME
+ print("menu Save as... to be done")
+ }
+
+
+
+ // save current document as PDF
+ internal func doSaveAsPDF()
+ {
+ //FIXME
+ print("menu Save as PDF... to be done")
+ }
+
+
+
+ // print current document
+ internal func startPrint()
+ {
+ //FIXME
+ print("menu Print... to be done")
+ }
+
+
+
+ // *** Handling of DocumentViewController delegate functions
+ // this handles open/create/copy/delete document
+
+
+
+ // Create an empty document, and present it
+ internal func documentBrowser(_ controller: UIDocumentBrowserViewController,
+ didRequestDocumentCreationWithHandler importHandler: @escaping (URL?,
+ UIDocumentBrowserViewController.ImportMode) -> Void)
+ {
+ //FIXME
+ }
+
+
+
+ // import (copy from iCloud to iPad) document, open it and present it
+ internal func documentBrowser(_ controller: UIDocumentBrowserViewController,
+ didImportDocumentAt sourceURL: URL,
+ toDestinationURL destinationURL: URL)
+ {
+ //FIXME
+ }
+
+
+
+ // Import failed, inform user
+ internal func documentBrowser(_ controller: UIDocumentBrowserViewController,
+ failedToImportDocumentAt documentURL: URL,
+ error: Error?)
+ {
+ //FIXME
+ }
+
+
+
+ // open document and present it
+ internal func documentBrowser(_ controller: UIDocumentBrowserViewController,
+ didPickDocumentURLs documentURLs: [URL])
+ {
+ openMenu?.dismiss(animated: true, completion: nil)
+ openMenu = nil
+ doOpen(documentURLs[0])
+ }
+
+
+
+ // *** Handling of document (open/print)
+
+
+
+ // Real open and presentation of document
+ public func doOpen(_ docURL : URL)
+ {
+ LOKitThread.instance.documentLoad(url: docURL.absoluteString)
+ {
+ doc, error in
+
+ if let document = doc
+ {
+
+ runOnMain
+ {
+ self.setDocument(doc: document)
+ }
+ }
+ else
+ {
+ // TODO - alert user of failure
+
+ }
+ }
+
+ /* FIXME
+ BridgeLOkit_Sizing(4, 4, 256, 256);
+ */
+ }
+
+ /// Sets the document to use and set's up it's view. Should be called on the main thread
+ public func setDocument(doc: DocumentHolder)
+ {
+ if let _ = self.document
+ {
+ // TODO - cleanup
+ self.document = nil
+ }
+ if let exisitingView = self.documentView
+ {
+ exisitingView.removeFromSuperview()
+ self.documentView = nil // forces the close of the view and it's held documents before we setup the new one
+ }
+ // also remove current overlays and start fresh
+ documentOverlaysView?.removeFromSuperview()
+
+ // setup the new doc view
+ self.document = doc
+ // setup delegates
+ doc.searchDelegate = self
+
+ let frameToUse = self.scrollView.frame
+
+ let docView = DocumentTiledView(frame: frameToUse, document: doc, scale: 1.0)
+
+ self.scrollView.addSubview(docView)
+ self.scrollView.contentSize = docView.frame.size
+ self.documentView = docView
+
+ // overlay view
+ let overlay = DocumentOverlaysView(docTiledView: docView)
+ docView.addSubview(overlay)
+ self.documentOverlaysView = overlay
+
+ // button view - used for spreadsheet tabs
+ if doc.isSpeadsheet
+ {
+ buttonScrollView.isHidden = false
+ buttonScrollView.setButtonLabels(labels: doc.partNames)
+ buttonScrollView.buttonClickedCallback = {
+ [weak self] index in
+ self?.document?.async {
+ $0.setPart(nPart: Int32(index))
+ runOnMain {
+ self?.documentView?.setNeedsDisplay()
+ }
+ }
+ }
+ // make room for the scroll view
+ zeroInsets = UIEdgeInsets(top: 0, left: 0, bottom: buttonScrollView.height, right: 0)
+ }
+ else
+ {
+ zeroInsets = .zero
+ buttonScrollView.isHidden = true
+ }
+ scrollView.contentInset = zeroInsets
+
+ // debugging view borders
+ /*
+ self.scrollView.layer.borderColor = UIColor.red.cgColor
+ self.scrollView.layer.borderWidth = 1.0
+ docView.layer.borderColor = UIColor.green.cgColor
+ docView.layer.borderWidth = 1.0
+ */
+ }
+
+ // MARK: - UIScrollViewDelegate
+}
+
+extension DocumentController: UIScrollViewDelegate
+{
+ // return a view that will be scaled. if delegate returns nil, nothing happens
+ func viewForZooming(in scrollView: UIScrollView) -> UIView?
+ {
+ return self.documentView
+ }
+
+ // called before the scroll view begins zooming its content
+ func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?)
+ {
+ print("scrollViewWillBeginZooming currentScale=\(scrollView.zoomScale)")
+ }
+
+ // scale between minimum and maximum. called after any 'bounce' animations
+ func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)
+ {
+ print("scrollViewDidEndZooming scale=\(scale)")
+ self.documentView?.scrollViewDidEndZooming(scrollView, with: view, atScale: scale)
+ }
+}
+
+ // MARK: - UIKeyInput
+// public var hasText: Bool
+// {
+// true
+// }
+//
+//
+// public func insertText(_ text: String)
+// {
+//
+// }
+//
+// public func deleteBackward()
+// {
+//
+// }
+
+extension DocumentController: ProgressDelegate
+{
+ // MARK: - ProgressDelegate
+ func statusIndicatorStart()
+ {
+ self.mask?.isHidden = false
+ self.progressBar?.isHidden = false
+ self.progressBar?.progress = 0.0
+ }
+
+ func statusIndicatorFinish()
+ {
+ // what would be nice would be to be able to wait until the initial tiles have rendered...
+ self.mask?.isHidden = true
+ self.progressBar?.isHidden = true
+ }
+
+ func statusIndicatorSetValue(value: Double)
+ {
+ self.progressBar?.progress = Float(value) / 100.0
+ }
+}
+
+extension DocumentController: UISearchBarDelegate
+{
+ // called when text changes (including clear)
+ func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
+ {
+
+ }
+
+
+ // called when keyboard search button pressed
+ func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
+ {
+ if let text = searchBar.text
+ {
+ if text.count > 0
+ {
+ document?.search(searchString: text, forwardDirection: true, from: CGPoint(x:0, y:0) )
+ }
+ }
+ }
+
+ func searchBarCancelButtonClicked(_ searchBar: UISearchBar)
+ {
+ searchBar.isHidden = true
+ }
+}
+
+extension DocumentController: SearchDelegate
+{
+ func searchNotFound()
+ {
+ // TODO: tell user somehow
+ self.documentOverlaysView?.clearSearchResults()
+ }
+
+ func searchResultSelection(searchResults: SearchResults)
+ {
+ self.documentOverlaysView?.setSearchResults(searchResults: searchResults)
+ }
+}
+
+/// Keyboard notifications
+extension DocumentController
+{
+
+ func registerKeyboardNotifications()
+ {
+ NotificationCenter.default.addObserver(self,
+ selector: #selector(keyboardWillShow(notification:)),
+ name: NSNotification.Name.UIKeyboardWillShow,
+ object: nil)
+ NotificationCenter.default.addObserver(self,
+ selector: #selector(keyboardWillHide(notification:)),
+ name: NSNotification.Name.UIKeyboardWillHide,
+ object: nil)
+ }
+
+ @objc func keyboardWillShow(notification: NSNotification)
+ {
+
+ let userInfo: NSDictionary = notification.userInfo! as NSDictionary
+ guard let keyboardInfo = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
+ print(userInfo)
+ let keyboardSize = keyboardInfo.cgRectValue.size
+ print("keyboardWillShow \(keyboardSize)")
+ let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
+ scrollView.contentInset = contentInsets
+ scrollView.scrollIndicatorInsets = contentInsets
+ }
+
+ @objc func keyboardWillHide(notification: NSNotification)
+ {
+ print("keyboardWillHide")
+ scrollView.contentInset = zeroInsets
+ scrollView.scrollIndicatorInsets = zeroInsets
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/DocumentOverlaysView.swift b/ios/LibreOfficeLight/LibreOfficeLight/DocumentOverlaysView.swift
new file mode 100644
index 000000000..16bc35c0a
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/DocumentOverlaysView.swift
@@ -0,0 +1,68 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import UIKit
+
+public class DocumentOverlaysView: UIView
+{
+ var searchSubViews: [UIView] = []
+ weak var documentTiledView: DocumentTiledView? = nil
+
+ public init(docTiledView: DocumentTiledView)
+ {
+ self.documentTiledView = docTiledView
+ super.init(frame: docTiledView.frame)
+
+ self.layer.compositingFilter = "multiplyBlendMode"
+ }
+
+ required public init?(coder aDecoder: NSCoder)
+ {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ public func clearSearchResults()
+ {
+ for v in self.searchSubViews
+ {
+ v.removeFromSuperview()
+ }
+ searchSubViews = []
+ }
+
+ public func setSearchResults(searchResults: SearchResults)
+ {
+ clearSearchResults()
+
+ guard let documentTiledView = self.documentTiledView else { return }
+
+ if let srs = searchResults.searchResultSelection
+ {
+ let allTheRects = srs.compactMap { $0.rectsAsCGRects }
+ .flatMap { $0 }
+ .map { documentTiledView.twipsToPixels(rect: $0) }
+
+ for rect in allTheRects
+ {
+ let subView = UIView(frame: rect)
+ subView.backgroundColor = UIColor.yellow // TODO
+ subView.layer.compositingFilter = "multiplyBlendMode"
+ self.addSubview(subView)
+ searchSubViews.append(subView)
+ }
+
+ if let first = allTheRects.first
+ {
+ if let scrollView = self.superview?.superview as? UIScrollView
+ {
+ scrollView.scrollRectToVisible(first, animated: true)
+ }
+ }
+ }
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/DocumentTiledView.swift b/ios/LibreOfficeLight/LibreOfficeLight/DocumentTiledView.swift
new file mode 100644
index 000000000..f0a36878c
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/DocumentTiledView.swift
@@ -0,0 +1,244 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import UIKit
+import QuartzCore
+
+
+class DocumentTiledLayer : CATiledLayer
+{
+ override class func fadeDuration() -> CFTimeInterval
+ {
+ return 0
+ }
+}
+
+/// The main tiled view, which sits inside the scroll view
+public class DocumentTiledView: UIView
+{
+ var myScale: CGFloat
+
+ weak var document: DocumentHolder? = nil
+
+ let initialSize: CGSize
+ let docSize: CGSize
+ let initialScaleFactor: CGFloat
+
+ var drawCount = 0
+
+ // Create a new view with the desired frame and scale.
+ public init(frame: CGRect, document: DocumentHolder, scale: CGFloat)
+ {
+ self.document = document
+
+ myScale = scale
+ initialSize = frame.size
+ var size = document.sync { $0.getDocumentSizeAsCGSize() }
+
+ // avoid divide by zero crashes
+ if (size.width == 0)
+ {
+ size.width = 1
+ }
+ if (size.height == 0)
+ {
+ size.height = 1
+ }
+ self.docSize = size
+ initialScaleFactor = (docSize.width / initialSize.width)
+ let scaledFrame = CGRect(x: 0, y: 0, width: frame.width, height: frame.width * (docSize.height / docSize.width))
+
+ print("DocumentTiledView.init frame=\(frame.desc) \n scaledFrame=\(scaledFrame.desc)\n docSize=\(docSize) \n initialScaleFactor=\(initialScaleFactor)")
+ super.init(frame: scaledFrame)
+
+ //self.contentScaleFactor = 1.0
+
+ if let tiledLayer = self.layer as? CATiledLayer
+ {
+ // these are all tweakable parameters, that give different behaviour to the tiled view
+ tiledLayer.levelsOfDetail = 4
+ tiledLayer.levelsOfDetailBias = 7
+ tiledLayer.tileSize = CGSize(width: 1024.0, height: 1024.0)
+ //tiledLayer.tileSize = CGSize(width: 512.0, height: 512.0)
+ }
+
+ let tap = UITapGestureRecognizer(target: self, action: #selector(onTap) )
+ tap.numberOfTapsRequired = 1
+ self.addGestureRecognizer(tap)
+
+ if (document.isPresentation) // only for preso atm
+ {
+ // add swipe left/right gestures on a preso
+ let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(onSwipeRight))
+ swipeRight.direction = .right
+ self.addGestureRecognizer(swipeRight)
+
+ let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(onSwipeLeft))
+ swipeLeft.direction = .left
+ self.addGestureRecognizer(swipeLeft)
+ }
+ }
+
+ required public init?(coder aDecoder: NSCoder)
+ {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ func incrementPart(amount: Int)
+ {
+ document?.incrementPart(amount: Int32(amount))
+ document?.async { _ in
+ runOnMain { self.setNeedsDisplay() }
+ }
+ }
+
+ public func twipsToPixels(rect: CGRect) -> CGRect
+ {
+ return rect.applying(CGAffineTransform(scaleX: 1.0/initialScaleFactor, y: 1.0/initialScaleFactor ))
+ }
+
+ public func pixelsToTwips(rect: CGRect) -> CGRect
+ {
+ return rect.applying(CGAffineTransform(scaleX: initialScaleFactor, y: initialScaleFactor ))
+ }
+
+
+ override public class var layerClass : AnyClass
+ {
+ return DocumentTiledLayer.self
+ }
+
+
+ override public func draw(_ r: CGRect)
+ {
+ // UIView uses the existence of -drawRect: to determine if it should allow its CALayer
+ // to be invalidated, which would then lead to the layer creating a backing store and
+ // -drawLayer:inContext: being called.
+ // By implementing an empty -drawRect: method, we allow UIKit to continue to implement
+ // this logic, while doing our real drawing work inside of -drawLayer:inContext:
+ }
+
+ // Draw the CGPDFPageRef into the layer at the correct scale.
+ override public func draw(_ layer: CALayer, in context: CGContext)
+ {
+// if self.superview == nil
+// {
+// // check that we are still active - ios is doing some really funny things where this method gets called after dealloc which causes bad bad karma
+// return
+// }
+ guard let document = self.document else
+ {
+ return
+ }
+
+ guard let tiledLayer = layer as? CATiledLayer else { return }
+
+
+
+ let tileSize: CGSize = tiledLayer.tileSize
+ let box: CGRect = context.boundingBoxOfClipPath
+ let ctm: CGAffineTransform = context.ctm
+
+ drawCount += 1
+ let filename = "tile\(drawCount).png"
+
+ print("drawLayer \(filename)\n bounds=\(layer.bounds.desc)\n ctm.a=\(ctm.a)\n tileSize=\(tileSize)\n box=\(box.desc)")
+
+ //context.setFillColor(UIColor.white.cgColor)
+ context.setFillColor(UIColor.blue.cgColor)
+ context.fill(box)
+ context.saveGState()
+
+ context.interpolationQuality = CGInterpolationQuality.high
+ context.setRenderingIntent(CGColorRenderingIntent.defaultIntent)
+
+ // This is where the magic happens
+
+ let pageRect = pixelsToTwips(rect: box)
+ print(" pageRect: \(pageRect.desc)")
+
+ // Figure out how many pixels we need for the dimensions of our tile
+ // tileSize represents a "full size" one in pixels
+
+ //let fullSizeTileInPoints = CGSize(width: CGFloat(tileSize.width) / ctm.a, height: CGFloat(tileSize.height) / ctm.a)
+ //let cropRectTileFraction = CGSize(width: box.size.width / fullSizeTileInPoints.width, height: box.size.height / fullSizeTileInPoints.height)
+ //let bitmapSize = CGSize(width: tileSize.width * cropRectTileFraction.width, height: tileSize.height * cropRectTileFraction.height)
+
+ let canvasSize = tileSize; //CGSize(width:512, height:512) // FIXME - this needs to be calculated
+
+ // we have to do the call synchronously, as the tile has to be painted now, on the current thread
+ // TODO - cache the image, and check the cache before we do the sync call
+ let image = document.paintTileToImage(canvasSize: canvasSize, tileRect: pageRect)
+
+
+ if let img = image
+ {
+ // Debugging: write the file to disk
+ /*
+ if let data = UIImagePNGRepresentation(img)
+ {
+ let filename = getDocumentsDirectory().appendingPathComponent(filename)
+ try? data.write(to: filename)
+ print("Wrote tile to: \(filename)")
+ }
+ */
+
+ // We use the UIImage draw function as it automatically handles the flipping of the co-ordinate system for us.
+ UIGraphicsPushContext(context);
+ img.draw(in: box)
+ UIGraphicsPopContext()
+ }
+
+ context.restoreGState()
+
+
+ }
+
+
+ deinit
+ {
+ self.document = nil
+
+ }
+
+
+ func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)
+ {
+ //self.setNeedsDisplay()
+ }
+
+
+}
+
+/// Gesture handlers
+public extension DocumentTiledView
+{
+ @objc func onTap(_ sender: UITapGestureRecognizer)
+ {
+ if (document?.isPresentation ?? false)
+ {
+ incrementPart(amount: 1)
+ }
+ }
+
+ @objc func onSwipeRight(_ sender: UISwipeGestureRecognizer)
+ {
+ if (document?.isPresentation ?? false)
+ {
+ incrementPart(amount: -1)
+ }
+ }
+
+ @objc func onSwipeLeft(_ sender: UISwipeGestureRecognizer)
+ {
+ if (document?.isPresentation ?? false)
+ {
+ incrementPart(amount: 1)
+ }
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Info.plist b/ios/LibreOfficeLight/LibreOfficeLight/Info.plist
new file mode 100644
index 000000000..82ce94908
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Info.plist
@@ -0,0 +1,1812 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Text</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.text</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Text</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.text</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Spreadsheet</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.spreadsheet</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Spreadsheet</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.spreadsheet</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Presentation</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.presentation</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Presentation</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.presentation</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Drawing</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.graphics</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Drawing</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.graphics</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Chart</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.chart</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Master</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.text-master</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Master</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.text-master</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Formula</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.formula</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Formula</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.formula</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Text Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.text-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Text Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.text-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Master Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.text-master-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Spreadsheet Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.spreadsheet-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Spreadsheet Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.spreadsheet-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Presentation Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.presentation-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Presentation Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.presentation-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenOffice.org 1.0 Drawing Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.graphics-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>OpenDocument Drawing Template</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.oasis-open.opendocument.graphics-template</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>LibreOfficeDev Extension</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.extension</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>Flat ODF</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Owner</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>vnd.oasis.opendocument.text-flat-xml</string>
+ <string>vnd.oasis.opendocument.spreadsheet-flat-xml</string>
+ <string>vnd.oasis.opendocument.presentation-flat-xml</string>
+ <string>vnd.oasis.opendocument.graphics-flat-xml</string>
+ </array>
+ </dict>
+ <dict>
+ <key>CFBundleTypeName</key>
+ <string>3rd party formats</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSHandlerRank</key>
+ <string>Alternate</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>public.plain-text</string>
+ <string>public.rtf</string>
+ <string>public.html</string>
+ <string>public.jpeg</string>
+ <string>public.tiff</string>
+ <string>public.png</string>
+ <string>public.xbitmap-image</string>
+ <string>com.adobe.encapsulated-postscript</string>
+ <string>com.microsoft.bmp</string>
+ <string>com.microsoft.word.doc</string>
+ <string>com.microsoft.word.dot</string>
+ <string>com.microsoft.excel.xls</string>
+ <string>com.microsoft.powerpoint.ppt</string>
+ <string>org.openxmlformats.wordprocessingml.document</string>
+ <string>org.openxmlformats.wordprocessingml.document.macroEnabled</string>
+ <string>org.openxmlformats.wordprocessingml.template</string>
+ <string>org.openxmlformats.wordprocessingml.template.macroEnabled</string>
+ <string>org.openxmlformats.spreadsheetml.sheet</string>
+ <string>org.openxmlformats.spreadsheetml.sheet.macroEnabled</string>
+ <string>com.microsoft.excel.sheet.binary.macroEnabled</string>
+ <string>org.openxmlformats.spreadsheetml.template</string>
+ <string>org.openxmlformats.spreadsheetml.template.macroEnabled</string>
+ <string>org.openxmlformats.presentationml.presentation</string>
+ <string>org.openxmlformats.presentationml.presentation.macroEnabled</string>
+ <string>org.openxmlformats.presentationml.template</string>
+ <string>org.openxmlformats.presentationml.template.macroEnabled</string>
+ <string>org.libreoffice.pdb-document</string>
+ <string>org.libreoffice.wpd-document</string>
+ <string>org.libreoffice.hwp-document</string>
+ <string>org.libreoffice.wks-document</string>
+ <string>org.libreoffice.wri-document</string>
+ <string>org.libreoffice.dif-document</string>
+ <string>org.libreoffice.slk-document</string>
+ <string>org.libreoffice.csv-document</string>
+ <string>org.libreoffice.dbf-document</string>
+ <string>org.libreoffice.123-document</string>
+ <string>org.libreoffice.cgm-document</string>
+ <string>org.libreoffice.dxf-document</string>
+ <string>org.libreoffice.emf-document</string>
+ <string>org.libreoffice.wmf-document</string>
+ <string>org.libreoffice.cdr-document</string>
+ <string>org.libreoffice.visio-document</string>
+ <string>org.libreoffice.mspub-document</string>
+ <string>com.adobe.pdf</string>
+ </array>
+ </dict>
+ </array>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>0.8.5</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>LSApplicationCategoryType</key>
+ <string>public.app-category.business</string>
+ <key>LSMultipleInstancesProhibited</key>
+ <true/>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>LSSupportsOpeningDocumentsInPlace</key>
+ <true/>
+ <key>NSHighResolutionCapable</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>The Source Code Form is subject to the terms of the Mozilla Public
+License, v. 2.0. If a copy of the MPL was not distributed with this
+file, You can obtain one at http://mozilla.org/MPL/2.0/.</string>
+ <key>NSUbiquitousContainers</key>
+ <dict>
+ <key>iCloud.com.jani.Editors.LibreOfficeLight</key>
+ <dict>
+ <key>NSUbiquitousContainerIsDocumentScopePublic</key>
+ <true/>
+ <key>NSUbiquitousContainerName</key>
+ <string>LibreOffice</string>
+ <key>NSUbiquitousContainerSupportedFolderLevels</key>
+ <string>None</string>
+ </dict>
+ </dict>
+ <key>UIFileSharingEnabled</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen.xib</string>
+ <key>UIMainStoryboardFile</key>
+ <string>Main</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UIRequiresFullScreen</key>
+ <false/>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportsDocumentBrowser</key>
+ <true/>
+ <key>UTExportedTypeDeclarations</key>
+ <array>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Text</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.text</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>text.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>sxw</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.writer</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Text</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.text</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-text.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>odt</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.text</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Text (Flat XML)</string>
+ <key>UTTypeIdentifier</key>
+ <string>vnd.oasis.opendocument.text-flat-xml</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-text.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>fodt</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.text-flat-xml</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Spreadsheet</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.spreadsheet</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>spreadsheet.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>sxc</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.calc</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Spreadsheet</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.spreadsheet</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-spreadsheet.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>ods</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.spreadsheet</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Spreadsheet (Flat XML)</string>
+ <key>UTTypeIdentifier</key>
+ <string>vnd.oasis.opendocument.spreadsheet-flat-xml</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-spreadsheet.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>fods</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.spreadsheet-flat-xml</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Presentation</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.presentation</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>presentation.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>sxi</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.impress</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Presentation</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.presentation</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-presentation.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>odp</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.presentation</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Presentation</string>
+ <key>UTTypeIdentifier</key>
+ <string>vnd.oasis.opendocument.presentation-flat-xml</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-presentation.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>fodp</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.presentation-flat-xml</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Drawing</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.graphics</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>drawing.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>sxd</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.draw</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Drawing</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.graphics</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-drawing.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>odg</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.graphics</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Drawing (Flat XML)</string>
+ <key>UTTypeIdentifier</key>
+ <string>vnd.oasis.opendocument.graphics-flat-xml</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-drawing.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>fodg</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.graphics-flat-xml</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Chart</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.chart</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>odc</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.chart</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Master</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.text-master</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>master-document.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>sxg</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.writer.global</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Master</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.text-master</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-master-document.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>odm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.text-master</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Formula</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.formula</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>formula.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>sxm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.math</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Formula</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.formula</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-formula.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>odf</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.formula</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Text Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.text-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>text-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>stw</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.writer.template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Text Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.text-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-text-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>ott</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.text-template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Text Master Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.text-master-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-master-document-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>otm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.text-master-template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Spreadsheet Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.spreadsheet-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>spreadsheet-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>stc</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.calc.template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Spreadsheet Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.spreadsheet-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-spreadsheet-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>ots</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.spreadsheet-template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Presentation Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.presentation-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>presentation-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>sti</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.impress.template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Presentation Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.presentation-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-presentation-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>otp</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.presentation-template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenOffice.org 1.0 Drawing Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.graphics-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>drawing-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>std</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.sun.xml.draw.template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>OpenDocument Drawing Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.oasis-open.opendocument.graphics-template</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>oasis-drawing-template.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>otg</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.oasis.opendocument.graphics-template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>LibreOfficeDev Extension</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openoffice.extension</string>
+ <key>UTTypeSize64IconFile</key>
+ <string>extension.icns</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>oxt</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.openofficeorg.extension</string>
+ </array>
+ </dict>
+ </dict>
+ </array>
+ <key>UTImportedTypeDeclarations</key>
+ <array>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.composite-content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Microsoft Word Template</string>
+ <key>UTTypeIdentifier</key>
+ <string>com.microsoft.word.dot</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>dot</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/msword</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML word processing document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.wordprocessingml.document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>docx</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.openxmlformats-officedocument.wordprocessingml.document</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML word processing document (macros enabled)</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.wordprocessingml.document.macroEnabled</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>docm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-word.document.macroEnabled.12</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML word processing template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.wordprocessingml.template</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>dotx</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.openxmlformats-officedocument.wordprocessingml.template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML word processing template (macros enabled)</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.wordprocessingml.template.macroEnabled</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>dotm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-word.template.macroEnabled.12</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML spreadsheet template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.spreadsheetml.template</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>xltx</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.openxmlformats-officedocument.spreadsheetml.template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML spreadsheet template (macros enabled)</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.spreadsheetml.template.macroEnabled</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>xltm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-excel.template.macroEnabled.12</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML spreadsheet</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.spreadsheetml.sheet</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>xlsx</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.zip-archive</string>
+ <string>public.composite-content</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Microsoft Excel 2007 spreadsheet (macros enabled)</string>
+ <key>UTTypeIdentifier</key>
+ <string>com.microsoft.excel.sheet.binary.macroEnabled</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>xlsb</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-excel.sheet.binary.macroEnabled.12</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.composite-content</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML spreadsheet (macros enabled)</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.spreadsheetml.sheet.macroEnabled</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>xlsm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-excel.sheet.macroEnabled.12</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.presentation</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML presentation</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.presentationml.presentation</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>pptx</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.openxmlformats-officedocument.presentationml.presentation</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.presentation</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML presentation (macros enabled)</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.presentationml.presentation.macroEnabled</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>pptm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-powerpoint.presentation.macroEnabled.12</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.presentation</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML presentation template</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.presentationml.template</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>potx</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.openxmlformats-officedocument.presentationml.template</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>org.openxmlformats.openxml</string>
+ <string>public.presentation</string>
+ <string>public.executable</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Office Open XML presentation template (macros enabled)</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.openxmlformats.presentationml.template.macroEnabled</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>potm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-powerpoint.template.macroEnabled.12</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>WordPerfect Document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.wpd-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>wpd</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.wordperfect</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>PalmDoc eBook </string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.pdb-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>pdb</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/x-aportisdoc</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Hangul WP 97 Document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.hwp-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>hwp</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/x-hwp</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Microsoft Works for Mac Document (v1 - v4)</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.wks-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>wps</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.ms-works</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Microsoft Write</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.wri-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>wri</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/x-mswrite</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Data Interchange Format</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.dif-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>dif</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/x-dif-document</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.text</string>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>SYLK Document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.slk-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>slk</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>text/spreadsheet</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.text</string>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Comma-Separated Value Document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.csv-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>csv</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>text/csv</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>dBASE Document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.dbf-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>dbf</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/x-dbase</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Lotus 1-2-3 Spreadsheet</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.123-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>wk1</string>
+ <string>wks</string>
+ <string>123</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.lotus-1-2-3</string>
+ <string>application/vnd.lotus-1-2-3</string>
+ <string>application/vnd.lotus-1-2-3</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ <string>public.image</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Computer Graphics Metafile</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.cgm-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>cgm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>image/cgm</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ <string>public.image</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>AutoCAD Interchange Format</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.dxf-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>dxf</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>image/vnd.dxf</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ <string>public.image</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Windows Enhanced Metafile</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.emf-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>emf</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>image/x-emf</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ <string>public.image</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Windows Metafile</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.wmf-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>wmf</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>image/x-wmf</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ <string>public.image</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>CorelDRAW Image</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.cdr-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>cdr</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/cdr</string>
+ <string>application/coreldraw</string>
+ <string>application/vnd.corel-draw</string>
+ <string>application/x-cdr</string>
+ <string>application/x-coreldraw</string>
+ <string>image/cdr</string>
+ <string>image/x-cdr</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Microsoft Visio Document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.visio-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>vsd</string>
+ <string>vss</string>
+ <string>vst</string>
+ <string>vdx</string>
+ <string>vsx</string>
+ <string>vtx</string>
+ <string>vsdx</string>
+ <string>vsdm</string>
+ <string>vssx</string>
+ <string>vssm</string>
+ <string>vstx</string>
+ <string>vstm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/vnd.visio2013</string>
+ <string>application/vnd.visio</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Microsoft Publisher Document</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.libreoffice.mspub-document</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>pub</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/x-mspublisher</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ <string>public.composite-​content</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>Apple PDF pasteboard type PDF data</string>
+ <key>UTTypeIdentifier</key>
+ <string>com.adobe.pdf</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>pdf</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>application/pdf</string>
+ </array>
+ </dict>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/AsyncUtil.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/AsyncUtil.swift
new file mode 100644
index 000000000..52f8c1bdd
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/AsyncUtil.swift
@@ -0,0 +1,92 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import Foundation
+
+
+public typealias Runnable = () -> ()
+
+/// Runs the closure on a queued background thread
+public func runInBackground(_ runnable: @escaping Runnable)
+{
+ DispatchQueue.global(qos: .background).async(execute: runnable)
+}
+
+
+/// Runs the closure on the UI (main) thread. Exceptions are caught and logged
+public func runOnMain(_ runnable: @escaping () -> ())
+{
+ DispatchQueue.main.async(execute: runnable)
+}
+
+/// Returns true if we are on the Main / UI thread
+public func isMainThread() -> Bool
+{
+ return Thread.isMainThread
+}
+
+/// Runs tasks in a serial way on a single thread.
+/// Why wouldn't we just use DispatchQueue or NSOperationQueue to do this?
+/// Because neither guarantee running their tasks on the same thread all the time.
+/// And in fact DispatchQueue will try and run sync tasks on the current thread where it can.
+/// Both classes try and abstract the thread away, whereas we have to use the same thread, or we end up with deadlocks in LOKit
+public class SingleThreadedQueue: Thread
+{
+ public init(name: String)
+ {
+ super.init()
+ self.name = name
+ self.start()
+ }
+
+ override public func main()
+ {
+ // You need the NSPort here because a runloop with no sources or ports registered with it
+ // will simply exit immediately instead of running forever.
+ let keepAlive = Port()
+ let rl = RunLoop.current
+ keepAlive.schedule(in: rl, forMode: .commonModes)
+
+ rl.run()
+ }
+
+ /// Run the task on the serial queue, and return immediately
+ public func async( _ runnable: @escaping Runnable)
+ {
+ let operation = BlockOperation {
+ runnable()
+ }
+ async(operation: operation)
+ }
+
+ /// Run the task on the serial queue, and return immediately
+ public func async( operation: Operation)
+ {
+ if ( Thread.current == self)
+ {
+ operation.start();
+ }
+ else
+ {
+ operation.perform(#selector(Operation.start), on: self, with: nil, waitUntilDone: false)
+ }
+ }
+
+ public func sync<R>( _ closure: @escaping () -> R ) -> R
+ {
+ var ret: R! = nil
+ let op = BlockOperation {
+ ret = closure();
+ }
+ async(operation: op)
+ op.waitUntilFinished()
+ return ret
+ }
+
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/Document.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/Document.swift
new file mode 100644
index 000000000..4e3b4b20e
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/Document.swift
@@ -0,0 +1,592 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import Foundation
+import UIKit
+import QuartzCore
+
+
+/// The Document class represents one loaded document instance
+/// Obtained through LibreOffice.documentLoad()
+open class Document
+{
+ private let pDoc: UnsafeMutablePointer<LibreOfficeKitDocument>
+ private let docClass: LibreOfficeKitDocumentClass
+
+ internal init(pDoc: UnsafeMutablePointer<LibreOfficeKitDocument>)
+ {
+ self.pDoc = pDoc
+ self.docClass = pDoc.pointee.pClass.pointee
+ }
+
+ /**
+ * Stores the document's persistent data to a URL and
+ * continues to be a representation of the old URL.
+ *
+ * @param pUrl the location where to store the document
+ * @param pFormat the format to use while exporting, when omitted, then deducted from pURL's extension
+ * @param pFilterOptions options for the export filter, e.g. SkipImages.
+ * Another useful FilterOption is "TakeOwnership". It is consumed
+ * by the saveAs() itself, and when provided, the document identity
+ * changes to the provided pUrl - meaning that '.uno:ModifiedStatus'
+ * is triggered as with the "Save As..." in the UI.
+ * "TakeOwnership" mode must not be used when saving to PNG or PDF.
+ */
+ public func saveAs(url: String, format: String? = nil, filterOptions: String? = nil) -> Bool
+ {
+ return docClass.saveAs(pDoc, url, format, filterOptions) != 0
+ }
+
+ /**
+ * Get document type.
+ *
+ * @since LibreOffice 6.0
+ * @return an element of the LibreOfficeKitDocumentType enum.
+ */
+ public func getDocumentType() -> LibreOfficeKitDocumentType
+ {
+ return LibreOfficeKitDocumentType(rawValue: LibreOfficeKitDocumentType.RawValue(docClass.getDocumentType(pDoc)))
+ }
+
+ /**
+ * Get number of part that the document contains.
+ *
+ * Part refers to either individual sheets in a Calc, or slides in Impress,
+ * and has no relevance for Writer.
+ */
+ public func getParts() -> Int32
+ {
+ return docClass.getParts(pDoc);
+ }
+
+ public func initializeForRendering()
+ {
+ docClass.initializeForRendering(pDoc, "") // TODO: arguments??
+ }
+
+ /**
+ * Get the logical rectangle of each part in the document.
+ *
+ * A part refers to an individual page in Writer and has no relevant for
+ * Calc or Impress.
+ *
+ * @return a rectangle list, using the same format as
+ * LOK_CALLBACK_TEXT_SELECTION.
+ */
+ public func getPartRectanges() -> String
+ {
+ return toString( docClass.getPartPageRectangles(pDoc) ) ?? ""
+
+ // TODO: convert to CGRects? Comes out like "284, 284, 11906, 16838; 284, 17406, 11906, 16838; 284, 34528, 11906, 16838"
+
+ }
+
+ /// Get the current part of the document.
+ public func getPart() -> Int32
+ {
+ return docClass.getPart(pDoc);
+ }
+
+ /// Set the current part of the document.
+ public func setPart( nPart: Int32 )
+ {
+ docClass.setPart(pDoc, nPart);
+ }
+
+ /// Get the current part's name.
+ public func getPartName( nPart: Int32) -> String?
+ {
+ return toString( docClass.getPartName(pDoc, nPart) )
+
+ }
+
+ /// Get the current part's hash.
+ public func getPartHash( nPart: Int32 ) -> String?
+ {
+ return toString( docClass.getPartHash(pDoc, nPart) )
+
+ }
+
+ public func setPartMode( nMode: Int32 )
+ {
+ docClass.setPartMode( pDoc, nMode);
+ }
+
+ /**
+ * Renders a subset of the document to a pre-allocated buffer.
+ *
+ * Note that the buffer size and the tile size implicitly supports
+ * rendering at different zoom levels, as the number of rendered pixels and
+ * the rendered rectangle of the document are independent.
+ *
+ * @param rCGContext Core Graphics context, cast to a UnsafeMutableRawPointer
+ * @param nCanvasWidth number of pixels in a row of pBuffer.
+ * @param nCanvasHeight number of pixels in a column of pBuffer.
+ * @param nTilePosX logical X position of the top left corner of the rendered rectangle, in TWIPs.
+ * @param nTilePosY logical Y position of the top left corner of the rendered rectangle, in TWIPs.
+ * @param nTileWidth logical width of the rendered rectangle, in TWIPs.
+ * @param nTileHeight logical height of the rendered rectangle, in TWIPs.
+ */
+ public func paintTileToCGContext( rCGContext: UnsafeMutableRawPointer,
+ canvasWidth: Int32,
+ canvasHeight: Int32,
+ tilePosX: Int32,
+ tilePosY: Int32,
+ tileWidth: Int32,
+ tileHeight: Int32)
+ {
+ print("paintTile canvasWidth=\(canvasWidth) canvasHeight=\(canvasHeight) tilePosX=\(tilePosX) tilePosY=\(tilePosY) tileWidth=\(tileWidth) tileHeight=\(tileHeight) ")
+ return docClass.paintTileToCGContext(pDoc, rCGContext, canvasWidth, canvasHeight,
+ tilePosX, tilePosY, tileWidth, tileHeight);
+ }
+
+ /**
+ * Renders a window (dialog, popup, etc.) with give id
+ *
+ * @param nWindowId
+ * @param pBuffer Buffer with enough memory allocated to render any dialog
+ * @param x x-coordinate from where the dialog should start painting
+ * @param y y-coordinate from where the dialog should start painting
+ * @param width The width of the dialog image to be painted
+ * @param height The height of the dialog image to be painted
+ */
+ public func paintWindow( nWindowId: UInt32,
+ pBuffer: UnsafeMutablePointer<UInt8>,
+ x: Int32,
+ y: Int32,
+ width: Int32,
+ height: Int32)
+ {
+ return docClass.paintWindow(pDoc, nWindowId, pBuffer, x, y, width, height);
+ }
+
+ /**
+ * Posts a command to the window (dialog, popup, etc.) with given id
+ *
+ * @param nWindowid
+ */
+ public func postWindow( nWindowId: UInt32, nAction: Int32, data: String)
+ {
+ return docClass.postWindow(pDoc, nWindowId, nAction, data);
+ }
+
+ /**
+ * Gets the tile mode: the pixel format used for the pBuffer of paintTile().
+ *
+ * @return an element of the LibreOfficeKitTileMode enum.
+ */
+ public func getTileMode() -> LibreOfficeKitTileMode
+ {
+ return LibreOfficeKitTileMode(rawValue: LibreOfficeKitTileMode.RawValue(docClass.getTileMode(pDoc)));
+ }
+
+ /// Get the document sizes in TWIPs.
+ public func getDocumentSize() -> (Int, Int)
+ {
+ print(Thread.isMainThread)
+ // long* pWidth, long* pHeight
+ var pWidth: Int = 0
+ var pHeight: Int = 0
+ docClass.getDocumentSize(pDoc, &pWidth, &pHeight);
+ return (pWidth, pHeight)
+ }
+
+ /**
+ * Initialize document for rendering.
+ *
+ * Sets the rendering and document parameters to default values that are
+ * needed to render the document correctly using tiled rendering. This
+ * method has to be called right after documentLoad() in case any of the
+ * tiled rendering methods are to be used later.
+ *
+ * Example argument string for text documents:
+ *
+ * {
+ * ".uno:HideWhitespace":
+ * {
+ * "type": "boolean",
+ * "value": "true"
+ * }
+ * }
+ *
+ * @param pArguments arguments of the rendering
+ */
+ public func initializeForRendering(arguments: String? = nil)
+ {
+ docClass.initializeForRendering(pDoc, arguments);
+ }
+
+ /**
+ * Registers a callback. LOK will invoke this function when it wants to
+ * inform the client about events.
+ *
+ * @param pCallback the callback to invoke
+ * @param pData the user data, will be passed to the callback on invocation
+ */
+ @discardableResult
+ public func registerCallback( callback: @escaping LibreOfficeCallback ) -> Int
+ {
+ let ret = Callbacks.register(callback: callback)
+ let pointer = UnsafeMutableRawPointer(bitPattern: ret)
+ docClass.registerCallback(pDoc, callbackFromLibreOffice, pointer)
+ return ret
+ }
+
+ /**
+ * Posts a keyboard event to the focused frame.
+ *
+ * @param nType Event type, like press or release.
+ * @param nCharCode contains the Unicode character generated by this event or 0
+ * @param nKeyCode contains the integer code representing the key of the event (non-zero for control keys)
+ */
+ public func postKeyEvent(nType: Int32, nCharCode: Int32, nKeyCode: Int32)
+ {
+ docClass.postKeyEvent(pDoc, nType, nCharCode, nKeyCode);
+ }
+
+ /**
+ * Posts a keyboard event to the dialog
+ *
+ * @param nWindowId
+ * @param nType Event type, like press or release.
+ * @param nCharCode contains the Unicode character generated by this event or 0
+ * @param nKeyCode contains the integer code representing the key of the event (non-zero for control keys)
+ */
+ public func postWindowKeyEvent( nWindowId: UInt32, nType: Int32, nCharCode: Int32, nKeyCode: Int32)
+ {
+ docClass.postWindowKeyEvent(pDoc, nWindowId, nType, nCharCode, nKeyCode);
+ }
+
+ /**
+ * Posts a mouse event to the document.
+ *
+ * @param nType Event type, like down, move or up.
+ * @param nX horizontal position in document coordinates
+ * @param nY vertical position in document coordinates
+ * @param nCount number of clicks: 1 for single click, 2 for double click
+ * @param nButtons: which mouse buttons: 1 for left, 2 for middle, 4 right
+ * @param nModifier: which keyboard modifier: (see include/vcl/vclenum.hxx for possible values)
+ */
+ public func postMouseEvent( nType: Int32, nX: Int32, nY: Int32, nCount: Int32, nButtons: Int32, nModifier: Int32)
+ {
+ docClass.postMouseEvent(pDoc, nType, nX, nY, nCount, nButtons, nModifier);
+ }
+
+ /**
+ * Posts a mouse event to the window with given id.
+ *
+ * @param nWindowId
+ * @param nType Event type, like down, move or up.
+ * @param nX horizontal position in document coordinates
+ * @param nY vertical position in document coordinates
+ * @param nCount number of clicks: 1 for single click, 2 for double click
+ * @param nButtons: which mouse buttons: 1 for left, 2 for middle, 4 right
+ * @param nModifier: which keyboard modifier: (see include/vcl/vclenum.hxx for possible values)
+ */
+ public func postWindowMouseEvent(nWindowId: UInt32, nType: Int32, nX: Int32, nY: Int32, nCount: Int32, nButtons: Int32, nModifier: Int32)
+ {
+ docClass.postWindowMouseEvent(pDoc, nWindowId, nType, nX, nY, nCount, nButtons, nModifier);
+ }
+
+ /**
+ * Posts a UNO command to the document.
+ *
+ * Example argument string:
+ *
+ * {
+ * "SearchItem.SearchString":
+ * {
+ * "type": "string",
+ * "value": "foobar"
+ * },
+ * "SearchItem.Backward":
+ * {
+ * "type": "boolean",
+ * "value": "false"
+ * }
+ * }
+ *
+ * @param pCommand uno command to be posted to the document, like ".uno:Bold"
+ * @param pArguments arguments of the uno command.
+ */
+ public func postUnoCommand(command: String, arguments: String? = nil, notifyWhenFinished: Bool = false)
+ {
+ docClass.postUnoCommand(pDoc, command, arguments, notifyWhenFinished);
+ }
+
+ /**
+ * Sets the start or end of a text selection.
+ *
+ * @param nType @see LibreOfficeKitSetTextSelectionType
+ * @param nX horizontal position in document coordinates
+ * @param nY vertical position in document coordinates
+ */
+ public func setTextSelection( nType: Int32, nX: Int32, nY: Int32)
+ {
+ docClass.setTextSelection(pDoc, nType, nX, nY);
+ }
+
+ /**
+ * Gets the currently selected text.
+ *
+ * @param pMimeType suggests the return format, for example text/plain;charset=utf-8.
+ * @param pUsedMimeType output parameter to inform about the determined format (suggested one or plain text).
+ */
+ // FIXME - work out how to use an inout param for usedMimeType
+ public func getTextSelection(mimeType: String, usedMimeType: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>? = nil) -> String?
+ {
+ return toString( docClass.getTextSelection(pDoc, mimeType, usedMimeType) );
+ }
+
+ /**
+ * Pastes content at the current cursor position.
+ *
+ * @param pMimeType format of pData, for example text/plain;charset=utf-8.
+ * @param pData the actual data to be pasted.
+ * @return if the supplied data was pasted successfully.
+ */
+ public func paste(mimeType: String, data: String, size: Int) -> Bool
+ {
+ return docClass.paste(pDoc, mimeType, data, size);
+ }
+
+ /**
+ * Adjusts the graphic selection.
+ *
+ * @param nType @see LibreOfficeKitSetGraphicSelectionType
+ * @param nX horizontal position in document coordinates
+ * @param nY vertical position in document coordinates
+ */
+ public func setGraphicSelection( nType: Int32, nX: Int32, nY: Int32)
+ {
+ docClass.setGraphicSelection(pDoc, nType, nX, nY);
+ }
+
+ /**
+ * Gets rid of any text or graphic selection.
+ */
+ public func resetSelection()
+ {
+ docClass.resetSelection(pDoc);
+ }
+
+ /**
+ * Returns a json mapping of the possible values for the given command
+ * e.g. {commandName: ".uno:StyleApply", commandValues: {"familyName1" : ["list of style names in the family1"], etc.}}
+ * @param pCommand a UNO command for which the possible values are requested
+ * @return {commandName: unoCmd, commandValues: {possible_values}}
+ */
+ public func getCommandValues(command: String) -> String?
+ {
+ return toString(docClass.getCommandValues(pDoc, command));
+ }
+
+ /**
+ * Save the client's view so that we can compute the right zoom level
+ * for the mouse events. This only affects CALC.
+ * @param nTilePixelWidth - tile width in pixels
+ * @param nTilePixelHeight - tile height in pixels
+ * @param nTileTwipWidth - tile width in twips
+ * @param nTileTwipHeight - tile height in twips
+ */
+ public func setClientZoom(
+ nTilePixelWidth: Int32,
+ nTilePixelHeight: Int32,
+ nTileTwipWidth: Int32,
+ nTileTwipHeight: Int32)
+ {
+ docClass.setClientZoom(pDoc, nTilePixelWidth, nTilePixelHeight, nTileTwipWidth, nTileTwipHeight);
+ }
+
+ /**
+ * Inform core about the currently visible area of the document on the
+ * client, so that it can perform e.g. page down (which depends on the
+ * visible height) in a sane way.
+ *
+ * @param nX - top left corner horizontal position
+ * @param nY - top left corner vertical position
+ * @param nWidth - area width
+ * @param nHeight - area height
+ */
+ public func setClientVisibleArea( nX: Int32, nY: Int32, nWidth: Int32, nHeight: Int32)
+ {
+ docClass.setClientVisibleArea(pDoc, nX, nY, nWidth, nHeight);
+ }
+
+ /**
+ * Show/Hide a single row/column header outline for Calc documents.
+ *
+ * @param bColumn - if we are dealing with a column or row group
+ * @param nLevel - the level to which the group belongs
+ * @param nIndex - the group entry index
+ * @param bHidden - the new group state (collapsed/expanded)
+ */
+ public func setOutlineState( column: Bool, level: Int32, index: Int32, hidden: Bool)
+ {
+ docClass.setOutlineState(pDoc, column, level, index, hidden);
+ }
+
+ /**
+ * Create a new view for an existing document.
+ * By default a loaded document has 1 view.
+ * @return the ID of the new view.
+ */
+ public func createView() -> Int32
+ {
+ return docClass.createView(pDoc);
+ }
+
+ /**
+ * Destroy a view of an existing document.
+ * @param nId a view ID, returned by createView().
+ */
+ public func destroyView( id: Int32 )
+ {
+ docClass.destroyView(pDoc, id);
+ }
+
+ /**
+ * Set an existing view of an existing document as current.
+ * @param nId a view ID, returned by createView().
+ */
+ public func setView(id: Int32)
+ {
+ docClass.setView(pDoc, id);
+ }
+
+ /**
+ * Get the current view.
+ * @return a view ID, previously returned by createView().
+ */
+ public func getView() -> Int32
+ {
+ return docClass.getView(pDoc);
+ }
+
+ /**
+ * Get number of views of this document.
+ */
+ public func getViewsCount() -> Int32
+ {
+ return docClass.getViewsCount(pDoc);
+ }
+
+ /**
+ * Paints a font name or character if provided to be displayed in the font list
+ * @param pFontName the font to be painted
+ */
+ // TODO
+// public func renderFont(fontName: String,
+// const char *pChar,
+// int *pFontWidth,
+// int *pFontHeight)
+// {
+// return docClass.renderFont(pDoc, pFontName, pChar, pFontWidth, pFontHeight);
+// }
+
+ /**
+ * Renders a subset of the document's part to a pre-allocated buffer.
+ *
+ * @param nPart the part number of the document of which the tile is painted.
+ * @see paintTile.
+ */
+ public func paintPartTile(pBuffer: UnsafeMutablePointer<UInt8>,
+ nPart: Int32,
+ nCanvasWidth: Int32,
+ nCanvasHeight: Int32,
+ nTilePosX: Int32,
+ nTilePosY: Int32,
+ nTileWidth: Int32,
+ nTileHeight: Int32)
+ {
+ return docClass.paintPartTile(pDoc, pBuffer, nPart,
+ nCanvasWidth, nCanvasHeight,
+ nTilePosX, nTilePosY,
+ nTileWidth, nTileHeight);
+ }
+
+ /**
+ * Returns the viewID for each existing view. Since viewIDs are not reused,
+ * viewIDs are not the same as the index of the view in the view array over
+ * time. Use getViewsCount() to know the minimal nSize that's large enough.
+ *
+ * @param pArray the array to write the viewIDs into
+ * @param nSize the size of pArray
+ * @returns true if pArray was large enough and result is written, false
+ * otherwise.
+ */
+// bool getViewIds(int* pArray,
+// size_t nSize)
+// {
+// return docClass.getViewIds(pDoc, pArray, nSize);
+// }
+
+ /**
+ * Set the language tag of the window with the specified nId.
+ *
+ * @param nId a view ID, returned by createView().
+ * @param language Bcp47 languageTag, like en-US or so.
+ */
+ public func setViewLanguage( id: Int32, language: String)
+ {
+ docClass.setViewLanguage(pDoc, id, language);
+ }
+
+ public func invokeHandlers()
+ {
+ // The app seems to work even without this? Or maybe I
+ // just didn't test hard enough?
+ // temporaryHackToInvokeCallbackHandlers(pDoc)
+
+ }
+
+}
+
+/**
+ * iOS friendly extensions of Document.
+ * TODO: move me back to the framework.
+ */
+public extension Document
+{
+ public func getDocumentSizeAsCGSize() -> CGSize
+ {
+ let (x,y) = self.getDocumentSize()
+ return CGSize(width: x, height: y)
+ }
+
+ public func paintTileToCurrentContext(canvasSize: CGSize,
+ tileRect: CGRect)
+ {
+ let ctx = UIGraphicsGetCurrentContext()
+ //print(ctx!)
+ let ptr = unsafeBitCast(ctx, to: UnsafeMutableRawPointer.self)
+ //print(ptr)
+
+ self.paintTileToCGContext(rCGContext:ptr,
+ canvasWidth: Int32(canvasSize.width),
+ canvasHeight: Int32(canvasSize.height),
+ tilePosX: Int32(tileRect.minX),
+ tilePosY: Int32(tileRect.minY),
+ tileWidth: Int32(tileRect.size.width),
+ tileHeight: Int32(tileRect.size.height))
+ }
+
+ public func paintTileToImage(canvasSize: CGSize,
+ tileRect: CGRect) -> UIImage?
+ {
+
+ UIGraphicsBeginImageContextWithOptions(canvasSize, false, 1.0)
+ let _ = UIGraphicsGetCurrentContext()!
+
+ self.paintTileToCurrentContext(canvasSize: canvasSize, tileRect: tileRect)
+ let image = UIGraphicsGetImageFromCurrentImageContext()
+ UIGraphicsEndImageContext()
+ return image
+ }
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/DocumentHolder.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/DocumentHolder.swift
new file mode 100644
index 000000000..cfc2cb678
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/DocumentHolder.swift
@@ -0,0 +1,345 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import Foundation
+import UIKit
+import QuartzCore
+
+/**
+ * Holds the document object so to enforce access in a thread safe way.
+ */
+public class DocumentHolder
+{
+ private let doc: Document
+
+ public weak var delegate: DocumentUIDelegate? = nil
+ public weak var searchDelegate: SearchDelegate? = nil
+
+ private let cache = RenderCache()
+
+ public let documentType: LibreOfficeKitDocumentType
+ public let documentSize: CGSize
+ public let views: Int32
+ public let parts: Int32
+ public let partNames: [String]
+
+ public private(set) var currentPart: Int32 = 0
+
+ init(doc: Document)
+ {
+ self.doc = doc
+
+ // we go and get a bunch of document properties and store them in properties
+ // this allows easy access to these without threading issues
+ // when we get to editing they will have to be invalidated
+
+ self.documentType = doc.getDocumentType()
+ documentSize = doc.getDocumentSizeAsCGSize()
+ views = doc.getViewsCount()
+ parts = doc.getParts()
+
+ var partNames = [String]()
+ for i in 0..<parts
+ {
+ let n = doc.getPartName(nPart: i) ?? ""
+ partNames.append(n)
+ }
+ self.partNames = partNames
+
+ doc.registerCallback() {
+ [weak self] typ, payload in
+ self?.onDocumentEvent(type: typ, payload: payload)
+ }
+ }
+
+ public var isPresentation: Bool
+ {
+ return documentType == LOK_DOCTYPE_PRESENTATION
+ }
+ public var isText: Bool
+ {
+ return documentType == LOK_DOCTYPE_TEXT
+ }
+ public var isDrawing: Bool
+ {
+ return documentType == LOK_DOCTYPE_DRAWING
+ }
+ public var isSpeadsheet: Bool
+ {
+ return documentType == LOK_DOCTYPE_SPREADSHEET
+ }
+
+ /// Gives async access to the document
+ public func async(_ closure: @escaping (Document) -> ())
+ {
+ LOKitThread.instance.async
+ {
+ closure(self.doc)
+ }
+ self.invokeHandlers()
+ }
+
+ public func invokeHandlers()
+ {
+ LOKitThread.instance.async
+ {
+ self.doc.invokeHandlers()
+ }
+ }
+
+ /// Gives sync access to the document - blocks until the closure runs.
+ /// Careful of deadlocks.
+ public func sync<R>( _ closure: @escaping (Document) -> R ) -> R
+ {
+ return LOKitThread.instance.sync
+ {
+ self.invokeHandlers()
+ return closure(self.doc)
+ }
+ }
+
+ /// Paints a tile and return synchronously, using a cached version if it can
+ public func paintTileToImage(canvasSize: CGSize,
+ tileRect: CGRect) -> UIImage?
+ {
+ if let cached = cache.get(part: currentPart, canvasSize: canvasSize, tileRect: tileRect)
+ {
+ return cached
+ }
+
+ let img = sync {
+ $0.paintTileToImage(canvasSize: canvasSize, tileRect: tileRect)
+ }
+ if let image = img
+ {
+ cache.add(cachedRender: CachedRender(part: currentPart, canvasSize: canvasSize, tileRect: tileRect, image: image))
+ }
+
+ return img
+ }
+
+ private func onDocumentEvent(type: LibreOfficeKitCallbackType, payload: String?)
+ {
+ print("onDocumentEvent type:\(type) payload:\(payload ?? "")")
+
+ switch type
+ {
+ case LOK_CALLBACK_INVALIDATE_TILES:
+ runOnMain {
+ self.delegate?.invalidateTiles( rects: decodeRects(payload) )
+ }
+ case LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR:
+ runOnMain {
+ self.delegate?.invalidateVisibleCursor( rects: decodeRects(payload) )
+ }
+ case LOK_CALLBACK_TEXT_SELECTION:
+ runOnMain {
+ self.delegate?.textSelection( rects: decodeRects(payload) )
+ }
+ case LOK_CALLBACK_TEXT_SELECTION_START:
+ runOnMain {
+ self.delegate?.textSelectionStart( rects: decodeRects(payload) )
+ }
+ case LOK_CALLBACK_TEXT_SELECTION_END:
+ runOnMain {
+ self.delegate?.textSelectionEnd( rects: decodeRects(payload) )
+ }
+
+ case LOK_CALLBACK_SEARCH_NOT_FOUND:
+ runOnMain {
+ self.searchDelegate?.searchNotFound()
+ }
+ case LOK_CALLBACK_SEARCH_RESULT_SELECTION:
+ runOnMain {
+ self.searchResults(payload: payload)
+ }
+
+ case LOK_CALLBACK_SET_PART:
+ if let p = payload, let newPart = Int32(p)
+ {
+ self.currentPart = newPart
+ // TODO: callback?
+ }
+
+ case LOK_CALLBACK_STATE_CHANGED:
+ // TODO: call backback
+ print("onDocumentEvent type: LOK_CALLBACK_STATE_CHANGED: \(payload ?? "")")
+
+ default:
+ print("onDocumentEvent type:\(type) not handled!")
+ }
+ }
+
+ private func searchResults(payload: String?)
+ {
+ if let d = payload, let data = d.data(using: .utf8)
+ {
+ let decoder = JSONDecoder()
+ do
+ {
+ let searchResults = try decoder.decode(SearchResults.self, from: data )
+ self.searchDelegate?.searchResultSelection(searchResults: searchResults)
+ }
+ catch
+ {
+ print("Error decoding payload: \(error)")
+ }
+ }
+ }
+
+ public func search(searchString: String, forwardDirection: Bool = true, from: CGPoint)
+ {
+ var rootJson = JSONObject()
+ addProperty(&rootJson, "SearchItem.SearchString", "string", searchString);
+ addProperty(&rootJson, "SearchItem.Backward", "boolean", String(!forwardDirection) );
+ addProperty(&rootJson, "SearchItem.SearchStartPointX", "long", String(describing: from.x) );
+ addProperty(&rootJson, "SearchItem.SearchStartPointY", "long", String(describing: from.y) );
+ addProperty(&rootJson, "SearchItem.Command", "long", "0") // String.valueOf(0)); // search all == 1
+
+ if let jsonStr = encode(json: rootJson)
+ {
+ async {
+ $0.postUnoCommand(command: ".uno:ExecuteSearch", arguments: jsonStr, notifyWhenFinished: true)
+ }
+ }
+ }
+
+ public func incrementPart(amount: Int32)
+ {
+ async {
+ document in
+ let currentPart = document.getPart()
+ let numParts = document.getParts()
+ let newPart = currentPart + amount
+ if (newPart < numParts && newPart > 0)
+ {
+ document.setPart(nPart: newPart)
+ }
+ }
+ }
+}
+
+public typealias JSONObject = Dictionary<String, AnyObject>
+public func addProperty( _ json: inout JSONObject, _ parentValue: String, _ type: String, _ value: String)
+{
+ var child = JSONObject();
+ child["type"] = type as AnyObject
+ child["value"] = value as AnyObject
+ json[parentValue] = child as AnyObject
+}
+
+func encode(json: JSONObject) -> String?
+{
+ if let data = try? JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
+ {
+ return String(data: data, encoding: String.Encoding.utf8)
+ }
+ return nil
+}
+
+/// Decodes a series of rectangles in the form: "x, y, width, height; x, y, width, height"
+public func decodeRects(_ payload: String?) -> [CGRect]?
+{
+ guard var pl = payload else { return nil }
+ pl = pl.trimmingCharacters(in: .whitespacesAndNewlines )
+ if pl == "EMPTY" || pl.count == 0
+ {
+ return nil
+ }
+ var ret = [CGRect]()
+ for rectStr in pl.split(separator: ";")
+ {
+ let coords = rectStr.split(separator: ",").compactMap { Double($0.trimmingCharacters(in: .whitespacesAndNewlines)) }
+ if coords.count == 4
+ {
+ let rect = CGRect(x: coords[0],
+ y: coords[1],
+ width: coords[2],
+ height: coords[3])
+ ret.append( rect )
+ }
+ }
+ return ret
+}
+
+// MARK :- Delegates
+
+public protocol DocumentUIDelegate: class
+{
+ func invalidateTiles(rects: [CGRect]? )
+ func invalidateVisibleCursor(rects: [CGRect]? )
+
+ func textSelection(rects: [CGRect]? )
+ func textSelectionStart(rects: [CGRect]? )
+ func textSelectionEnd(rects: [CGRect]? )
+}
+
+public protocol SearchDelegate: class
+{
+ func searchNotFound()
+ func searchResultSelection(searchResults: SearchResults)
+}
+
+/**
+ Encodes this example json:
+ {
+ "searchString": "Office",
+ "highlightAll": "true",
+ "searchResultSelection": [
+ {
+ "part": "0",
+ "rectangles": "1951, 10743, 627, 239"
+ },
+ {
+ "part": "0",
+ "rectangles": "5343, 9496, 627, 287"
+ },
+ {
+ "part": "0",
+ "rectangles": "1951, 9256, 627, 239"
+ },
+ {
+ "part": "0",
+ "rectangles": "6502, 5946, 626, 287"
+ },
+ {
+ "part": "0",
+ "rectangles": "6686, 5658, 627, 287"
+ },
+ {
+ "part": "0",
+ "rectangles": "4103, 5418, 573, 239"
+ },
+ {
+ "part": "0",
+ "rectangles": "1951, 5418, 627, 239"
+ },
+ {
+ "part": "0",
+ "rectangles": "4934, 1658, 1586, 559"
+ }
+ ]
+ }
+ */
+public struct SearchResults: Codable
+{
+ public var searchString: String?
+ public var highlightAll: String?
+ public var searchResultSelection: Array<PartAndRectangles>?
+}
+
+public struct PartAndRectangles: Codable
+{
+ public var part: String?
+ public var rectangles: String?
+
+ public var rectsAsCGRects: [CGRect]? {
+ return decodeRects(self.rectangles)
+ }
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LOKitThread.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LOKitThread.swift
new file mode 100644
index 000000000..cdf73ab2d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LOKitThread.swift
@@ -0,0 +1,139 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import Foundation
+import UIKit
+
+
+
+
+/// Serves the same purpose as the LOKitThread in the Android project - sequentialises all access to LOKit on a background thread, off the UI thread.
+/// It's a singleton, and keeps a single instance of LibreOfficeKit
+/// Public methods may be called from any thread, and will dispatch their work onto the held sequential queue.
+/// TODO: move me to framework
+public class LOKitThread
+{
+ public static let instance = LOKitThread() // statics are lazy and thread safe in swift, so no need for anything more complex
+
+
+ fileprivate let queue = SingleThreadedQueue(name: "LOKitThread.queue")
+
+ /// singleton LibreOffice instance. Can only be accessed through the queue.
+ var libreOffice: LibreOffice! = nil // initialised in didFinishLaunchingWithOptions
+
+ public weak var delegate: LOKitUIDelegate? = nil
+ public weak var progressDelegate: ProgressDelegate? = nil
+
+ private init()
+ {
+
+ async {
+ self.libreOffice = try! LibreOffice() // will blow up the app if it throws, but fair enough
+
+ // hook up event handler
+ self.libreOffice.registerCallback(callback: self.onLOKEvent)
+
+ }
+ }
+
+ private func onLOKEvent(type: LibreOfficeKitCallbackType, payload: String?)
+ {
+ //LibreOfficeLight.LibreOfficeKitKeyEventType.
+ print("onLOKEvent type:\(type) payload:\(payload ?? "")")
+
+ switch type
+ {
+ case LOK_CALLBACK_STATUS_INDICATOR_START:
+ runOnMain {
+ self.progressDelegate?.statusIndicatorStart()
+ }
+
+ case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE:
+ runOnMain {
+ if let doub = Double(payload ?? "")
+ {
+ self.progressDelegate?.statusIndicatorSetValue(value: doub)
+ }
+ }
+
+ case LOK_CALLBACK_STATUS_INDICATOR_FINISH:
+ runOnMain {
+ self.progressDelegate?.statusIndicatorFinish()
+ }
+ default:
+ print("onLOKEvent type:\(type) not handled!")
+ }
+ }
+
+ /// Run the task on the serial queue, and return immediately
+ public func async(_ runnable: @escaping Runnable)
+ {
+ queue.async( runnable)
+ }
+
+ /// Run the task on the serial queue, and block to get the result
+ /// Careful of deadlocking!
+ public func sync<R>( _ closure: @escaping () -> R ) -> R
+ {
+ let ret = queue.sync( closure )
+ return ret
+ }
+
+ public func withLibreOffice( _ closure: @escaping (LibreOffice) -> ())
+ {
+ async {
+ closure(self.libreOffice)
+ }
+ }
+
+ /// Loads a document, and calls the callback with a wrapper if successful, or an error if not.
+ public func documentLoad(url: String, callback: @escaping (DocumentHolder?, Error?) -> ())
+ {
+ withLibreOffice
+ {
+ lo in
+
+ do
+ {
+ // this is trying to avoid null context errors which pop up on doc init
+ // doesn't seem to fix
+ UIGraphicsBeginImageContext(CGSize(width:1,height:1))
+ let doc = try lo.documentLoad(url: url)
+ print("Opened document: \(url)")
+ doc.initializeForRendering()
+ UIGraphicsEndImageContext()
+
+ callback(DocumentHolder(doc: doc), nil)
+ }
+ catch
+ {
+ print("Failed to load document: \(error)")
+ callback(nil, error)
+ }
+ }
+ }
+}
+
+/**
+ * Delegate methods for global events emitted from LOKit.
+ * Mostly dispatched on the main thread unless noted.
+ */
+public protocol LOKitUIDelegate: class
+{
+ // Nothing ATM...
+}
+
+public protocol ProgressDelegate: class
+{
+ func statusIndicatorStart()
+ func statusIndicatorFinish()
+ func statusIndicatorSetValue(value: Double)
+}
+
+
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitIOSTests.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitIOSTests.swift
new file mode 100644
index 000000000..de9f1ee82
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitIOSTests.swift
@@ -0,0 +1,102 @@
+//
+// LibreOfficeKitIOSTests.swift
+// LibreOfficeKitIOSTests
+//
+// Created by Jon Nermut on 30/12/17.
+// Copyright © 2017 LibreOffice. All rights reserved.
+//
+
+import XCTest
+@testable import LibreOfficeKitIOS
+
+class LibreOfficeKitIOSTests: XCTestCase {
+
+ override func setUp() {
+ super.setUp()
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ super.tearDown()
+ }
+
+
+
+ func testLoadingSimpleDoc() {
+
+ guard let lo = try? LibreOffice() else
+ {
+ XCTFail("Could not start LibreOffice")
+ return
+ }
+
+ let b = Bundle.init(for: LibreOfficeKitIOSTests.self)
+ guard let url = b.url(forResource: "test-page-format", withExtension: "docx") else
+ {
+ XCTFail("Failed to get url to test doc")
+ return
+ }
+
+ var loCallbackCount = 0
+ lo.registerCallback()
+ {
+ typ, payload in
+ print(typ)
+ print(payload)
+ loCallbackCount += 1
+ }
+
+ guard let doc = try? lo.documentLoad(url: url.absoluteString) else
+ {
+ XCTFail("Could not load document")
+ return
+ }
+
+ var docCallbackCount = 0
+ doc.registerCallback()
+ {
+ typ, payload in
+ print(typ)
+ print(payload)
+ docCallbackCount += 1
+ }
+
+ //let typ: LibreOfficeDocumentType = doc.getDocumentType()
+ //XCTAssertTrue(typ == LibreOfficeDocumentType.LOK_DOCTYPE_TEXT)
+
+ doc.initializeForRendering()
+ let rects = doc.getPartRectanges()
+ print(rects) // 284, 284, 12240, 15840; 284, 16408, 12240, 15840
+ let tileMode = doc.getTileMode()
+ print(tileMode) // 1
+ let canvasSize = CGSize(width: 1024,height: 1024)
+ let tile = CGRect(x: 284, y: 284, width: 12240, height: 12240)
+
+
+ guard let image = doc.paintTileToImage(canvasSize: canvasSize, tileRect: tile) else
+ {
+ XCTFail("No image")
+ return
+ }
+ if let data = UIImagePNGRepresentation(image)
+ {
+ let filename = getDocumentsDirectory().appendingPathComponent("tile1.png")
+ try? data.write(to: filename)
+ print("Wrote tile to: \(filename)")
+ }
+ }
+
+}
+
+func getDocumentsDirectory() -> URL
+{
+ let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
+ return paths[0]
+}
+
+public extension Document
+{
+
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitWrapper.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitWrapper.swift
new file mode 100644
index 000000000..375dd6def
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/LibreOfficeKitWrapper.swift
@@ -0,0 +1,231 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import Foundation
+
+
+public struct LibreOfficeError: Error
+{
+ let message: String
+ public init(_ message: String)
+ {
+ self.message = message
+ }
+}
+
+public typealias LibreOfficeCallback = (_ type: LibreOfficeKitCallbackType, _ payload: String?) -> ()
+
+func callbackFromLibreOffice(nType: Int32, payload: UnsafePointer<Int8>?, pData: UnsafeMutableRawPointer?)
+{
+ if let val = pData?.hashValue
+ {
+ if let theFunc = Callbacks.callbackRegister[val]
+ {
+ let payString = toString(payload)
+ theFunc(LibreOfficeKitCallbackType(rawValue: LibreOfficeKitCallbackType.RawValue(nType)), payString)
+ }
+ else
+ {
+ print("Unknown callback: \(val)")
+ }
+ }
+ else
+ {
+ print("callbackFromLibreOffice, but pData was nil")
+ }
+}
+
+
+internal struct Callbacks
+{
+ static var count = 0
+ static var callbackRegister: Dictionary<Int, LibreOfficeCallback> = [:]
+
+ static func register(callback: @escaping LibreOfficeCallback) -> Int
+ {
+ count += 1
+ let id = count
+ callbackRegister[id] = callback
+ return id
+
+ }
+}
+
+
+open class LibreOffice
+{
+ private let pLok: UnsafeMutablePointer<LibreOfficeKit>
+ private let lokClass: LibreOfficeKitClass
+
+ public init() throws
+ {
+ let b = Bundle.init(for: LibreOffice.self)
+ let path = b.bundlePath // not Bundle.main.bundlePath
+ let docsDir = getDocumentsDirectory()
+ let userDir = docsDir.appendingPathComponent("user")
+ print("Calling BridgeLOkit_Init with \(path), \(userDir.path)" )
+ BridgeLOkit_Init(path, userDir.path)
+ let pLok = BridgeLOkit_getLOK()
+ if let lokClass = pLok?.pointee.pClass?.pointee
+ {
+ self.pLok = pLok!
+ self.lokClass = lokClass
+ print("Loaded LibreOfficeKit: \(self.getVersionInfo() ?? "")")
+ return
+ }
+ throw LibreOfficeError("Unable to init LibreOfficeKit")
+ }
+
+ /**
+ * Get version information of the LOKit process
+ *
+ * @since LibreOffice 6.0
+ * @returns JSON string containing version information in format:
+ * {ProductName: <>, ProductVersion: <>, ProductExtension: <>, BuildId: <>}
+ *
+ * Eg: {"ProductName": "LibreOffice",
+ * "ProductVersion": "5.3",
+ * "ProductExtension": ".0.0.alpha0",
+ * "BuildId": "<full 40 char git hash>"}
+ */
+ public func getVersionInfo() -> String?
+ {
+ if let pRet = lokClass.getVersionInfo(pLok)
+ {
+ return String(cString: pRet) // TODO: convert JSON
+ }
+ return nil
+ }
+
+ /**
+ * Loads a document from a URL.
+ *
+ * @param pUrl the URL of the document to load
+ * @param pFilterOptions options for the import filter, e.g. SkipImages.
+ * Another useful FilterOption is "Language=...". It is consumed
+ * by the documentLoad() itself, and when provided, LibreOfficeKit
+ * switches the language accordingly first.
+ * @since pFilterOptions argument added in LibreOffice 5.0
+ */
+ public func documentLoad(url: String) throws -> Document
+ {
+ if let pDoc = lokClass.documentLoad(pLok, url)
+ {
+ return Document(pDoc: pDoc)
+ }
+ throw LibreOfficeError("Unable to load document")
+ }
+
+
+
+ /// Returns the last error as a string
+ public func getError() -> String?
+ {
+ if let cstr = lokClass.getError(pLok)
+ {
+ let ret = String(cString: cstr)
+ lokClass.freeError(cstr)
+ return ret
+ }
+ return nil
+ }
+
+
+ /**
+ * Registers a callback. LOK will invoke this function when it wants to
+ * inform the client about events.
+ *
+ * @since LibreOffice 6.0
+ * @param pCallback the callback to invoke
+ * @param pData the user data, will be passed to the callback on invocation
+ */
+ @discardableResult
+ public func registerCallback( callback: @escaping LibreOfficeCallback ) -> Int
+ {
+ let ret = Callbacks.register(callback: callback)
+ let pointer = UnsafeMutableRawPointer(bitPattern: ret)
+ lokClass.registerCallback(pLok, callbackFromLibreOffice, pointer)
+ return ret
+ }
+
+ /**
+ * Returns details of filter types.
+ *
+ * Example returned string:
+ *
+ * {
+ * "writer8": {
+ * "MediaType": "application/vnd.oasis.opendocument.text"
+ * },
+ * "calc8": {
+ * "MediaType": "application/vnd.oasis.opendocument.spreadsheet"
+ * }
+ * }
+ *
+ * @since LibreOffice 6.0
+ */
+ public func getFilterTypes() -> String?
+ {
+ return toString(lokClass.getFilterTypes(pLok));
+ }
+
+ /**
+ * Set bitmask of optional features supported by the client.
+ *
+ * @since LibreOffice 6.0
+ * @see LibreOfficeKitOptionalFeatures
+ */
+ public func setOptionalFeatures(features: UInt64)
+ {
+ return lokClass.setOptionalFeatures(pLok, features);
+ }
+
+ /**
+ * Set password required for loading or editing a document.
+ *
+ * Loading the document is blocked until the password is provided.
+ *
+ * @param pURL the URL of the document, as sent to the callback
+ * @param pPassword the password, nullptr indicates no password
+ *
+ * In response to LOK_CALLBACK_DOCUMENT_PASSWORD, a valid password
+ * will continue loading the document, an invalid password will
+ * result in another LOK_CALLBACK_DOCUMENT_PASSWORD request,
+ * and a NULL password will abort loading the document.
+ *
+ * In response to LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY, a valid
+ * password will continue loading the document, an invalid password will
+ * result in another LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY request,
+ * and a NULL password will continue loading the document in read-only
+ * mode.
+ *
+ * @since LibreOffice 6.0
+ */
+ public func setDocumentPassword(URL: String, password: String)
+ {
+ lokClass.setDocumentPassword(pLok, URL, password);
+ }
+
+
+
+
+ /**
+ * Run a macro.
+ *
+ * Same syntax as on command line is permissible (ie. the macro:// URI forms)
+ *
+ * @since LibreOffice 6.0
+ * @param pURL macro url to run
+ */
+
+ public func runMacro( URL: String ) -> Bool
+ {
+ return lokClass.runMacro( pLok, URL ) != 0;
+ }
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/RenderCache.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/RenderCache.swift
new file mode 100644
index 000000000..f217db041
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/RenderCache.swift
@@ -0,0 +1,78 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import Foundation
+import UIKit
+
+
+open class CachedRender
+{
+ open let part: Int32
+ open let canvasSize: CGSize
+ open let tileRect: CGRect
+ open let image: UIImage
+
+ public init(part: Int32, canvasSize: CGSize, tileRect: CGRect, image: UIImage)
+ {
+ self.canvasSize = canvasSize
+ self.tileRect = tileRect
+ self.image = image
+ self.part = part
+ }
+}
+
+class RenderCache
+{
+ let CACHE_LOWMEM = 4
+ let CACHE_NORMAL = 20
+
+ var cachedRenders: [CachedRender] = []
+ var hasReceivedMemoryWarning = false
+
+ let lock = NSRecursiveLock()
+
+ func emptyCache()
+ {
+ lock.lock(); defer { lock.unlock() }
+ cachedRenders.removeAll()
+ }
+
+ func pruneCache()
+ {
+ lock.lock(); defer { lock.unlock() }
+
+ let max = hasReceivedMemoryWarning ? CACHE_LOWMEM : CACHE_NORMAL
+ while cachedRenders.count > max
+ {
+ cachedRenders.remove(at: 0)
+ }
+ }
+
+ func add(cachedRender: CachedRender)
+ {
+ lock.lock(); defer { lock.unlock() }
+
+ cachedRenders.append(cachedRender)
+ pruneCache()
+ }
+
+ func get(part: Int32, canvasSize: CGSize, tileRect: CGRect) -> UIImage?
+ {
+ lock.lock(); defer { lock.unlock() }
+
+ if let cr = cachedRenders.first(where: {
+ $0.canvasSize == canvasSize
+ && $0.tileRect == tileRect
+ && $0.part == part
+ })
+ {
+ return cr.image
+ }
+ return nil
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LOKit/Util.swift b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/Util.swift
new file mode 100644
index 000000000..596ca45e3
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LOKit/Util.swift
@@ -0,0 +1,43 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import UIKit
+
+
+func getDocumentsDirectory() -> URL
+{
+ let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
+ return paths[0]
+}
+
+public extension CGRect
+{
+ public var desc: String
+ {
+ return "(x: \(self.origin.x), y: \(self.origin.y), width: \(self.size.width), height: \(self.size.height), maxX: \(self.maxX), maxY: \(self.maxY))"
+ }
+}
+
+public func toString(_ pointer: UnsafeMutablePointer<Int8>?) -> String?
+{
+ if let p = pointer
+ {
+ return String(cString: p)
+ }
+ return nil
+}
+
+public func toString(_ pointer: UnsafePointer<Int8>?) -> String?
+{
+ if let p = pointer
+ {
+ return String(cString: p)
+ }
+ return nil
+}
+
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight-Prefix.pch b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight-Prefix.pch
new file mode 100644
index 000000000..638bf30e8
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight-Prefix.pch
@@ -0,0 +1,22 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #include <premac.h>
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+ #include <postmac.h>
+#endif
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.entitlements b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.entitlements
new file mode 100644
index 000000000..bb42bb6ea
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.entitlements
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>com.apple.developer.icloud-container-identifiers</key>
+ <array>
+ <string>iCloud.$(CFBundleIdentifier)</string>
+ </array>
+ <key>com.apple.developer.icloud-services</key>
+ <array>
+ <string>CloudDocuments</string>
+ </array>
+ <key>com.apple.developer.ubiquity-container-identifiers</key>
+ <array>
+ <string>iCloud.$(CFBundleIdentifier)</string>
+ </array>
+</dict>
+</plist>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/.xccurrentversion b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/.xccurrentversion
new file mode 100644
index 000000000..0c67376eb
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/.xccurrentversion
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict/>
+</plist>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/LibreOfficeLight.xcdatamodel/contents b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/LibreOfficeLight.xcdatamodel/contents
new file mode 100644
index 000000000..476e5b6cf
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/LibreOfficeLight.xcdatamodeld/LibreOfficeLight.xcdatamodel/contents
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="1" systemVersion="11A491" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
+ <elements/>
+</model> \ No newline at end of file
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/PropertiesController.swift b/ios/LibreOfficeLight/LibreOfficeLight/PropertiesController.swift
new file mode 100644
index 000000000..04ebaf78d
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/PropertiesController.swift
@@ -0,0 +1,99 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+import UIKit
+
+
+class PropertiesController: UIViewController
+{
+ // Temp. functions
+ @IBAction func doStyle1(_ sender: UIButton)
+ {
+ loadController("Document")
+ }
+
+
+
+ @IBAction func doStyle2(_ sender: UIButton)
+ {
+ loadController("Document")
+ }
+
+
+
+ @IBAction func doStyle3(_ sender: UIButton)
+ {
+ loadController("Document")
+ }
+
+
+
+ @IBAction func doStyle4(_ sender: UIButton)
+ {
+ loadController("Document")
+ }
+
+
+
+ @IBAction func doStyle5(_ sender: UIButton)
+ {
+ loadController("Document")
+ }
+
+
+
+ @IBAction func doStyle6(_ sender: UIButton)
+ {
+ loadController("Document")
+ }
+
+
+ @IBAction func doStyle7(_ sender: UIButton)
+ {
+ loadController("Document")
+ }
+
+
+
+ func loadController(_ name:String)
+ {
+ let destController : UIViewController = self.storyboard!.instantiateViewController(withIdentifier: name)
+ self.navigationController!.pushViewController(destController, animated: true)
+
+ UIView.animate(withDuration: 0.3, animations: { () -> Void in
+ self.view.frame = CGRect(x: -UIScreen.main.bounds.size.width, y: 0, width: UIScreen.main.bounds.size.width,height: UIScreen.main.bounds.size.height)
+ self.view.layoutIfNeeded()
+ self.view.backgroundColor = UIColor.clear
+ }, completion: { (finished) -> Void in
+ self.view.removeFromSuperview()
+ self.removeFromParentViewController()
+ })
+ }
+
+
+
+ override func viewDidLoad()
+ {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+
+ override func didReceiveMemoryWarning()
+ {
+ super.didReceiveMemoryWarning()
+ // Dispose of any resources that can be recreated.
+ }
+
+
+
+ override func viewWillAppear(_ animated: Bool)
+ {
+ super.viewWillAppear(animated)
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/Root.plist b/ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/Root.plist
new file mode 100644
index 000000000..0865e51d7
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/Root.plist
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>StringsTable</key>
+ <string>Root</string>
+ <key>PreferenceSpecifiers</key>
+ <array>
+ <dict>
+ <key>Type</key>
+ <string>PSGroupSpecifier</string>
+ <key>Title</key>
+ <string>About</string>
+ </dict>
+ <dict>
+ <key>DefaultValue</key>
+ <string>The Source Code Form is subject to the terms of the Mozilla Public
+License, v. 2.0.</string>
+ <key>Type</key>
+ <string>PSTextFieldSpecifier</string>
+ <key>Title</key>
+ <string>Copyright</string>
+ <key>Key</key>
+ <string>some text</string>
+ </dict>
+ <dict>
+ <key>DefaultValue</key>
+ <string>0.0.0</string>
+ <key>Type</key>
+ <string>PSTextFieldSpecifier</string>
+ <key>Title</key>
+ <string>Version</string>
+ <key>Key</key>
+ <string>application_version</string>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/en.lproj/Root.strings b/ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/en.lproj/Root.strings
new file mode 100644
index 000000000..8cd87b9d6
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/en.lproj/Root.strings
Binary files differ
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/UIViewExtensions.swift b/ios/LibreOfficeLight/LibreOfficeLight/UIViewExtensions.swift
new file mode 100644
index 000000000..1c0322331
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/UIViewExtensions.swift
@@ -0,0 +1,74 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+import UIKit
+
+public extension UIView
+{
+ public var height: CGFloat
+ {
+ get
+ {
+ return frame.size.height
+ }
+ set
+ {
+ frame.size.height = newValue
+ }
+ }
+
+ public var size: CGSize
+ {
+ get
+ {
+ return frame.size
+ }
+ set
+ {
+ width = newValue.width
+ height = newValue.height
+ }
+ }
+
+ public var width: CGFloat
+ {
+ get
+ {
+ return frame.size.width
+ }
+ set
+ {
+ frame.size.width = newValue
+ }
+ }
+
+ public var x: CGFloat
+ {
+ get
+ {
+ return frame.origin.x
+ }
+ set
+ {
+ frame.origin.x = newValue
+ }
+ }
+
+
+ public var y: CGFloat
+ {
+ get
+ {
+ return frame.origin.y
+ }
+ set
+ {
+ frame.origin.y = newValue
+ }
+ }
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/ViewPrintManager.swift b/ios/LibreOfficeLight/LibreOfficeLight/ViewPrintManager.swift
new file mode 100644
index 000000000..e05fa553f
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/ViewPrintManager.swift
@@ -0,0 +1,27 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+import UIKit
+
+
+class ViewPrintManager: UIViewController
+{
+ override func viewDidLoad()
+ {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+
+ override func didReceiveMemoryWarning()
+ {
+ super.didReceiveMemoryWarning()
+ // Dispose of any resources that can be recreated.
+ }
+
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/ViewProperties.swift b/ios/LibreOfficeLight/LibreOfficeLight/ViewProperties.swift
new file mode 100644
index 000000000..2e275f2bd
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/ViewProperties.swift
@@ -0,0 +1,30 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+import UIKit
+
+
+class ViewProperties: UIViewController
+{
+
+
+ override func viewDidLoad()
+ {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+
+ override func didReceiveMemoryWarning()
+ {
+ super.didReceiveMemoryWarning()
+ // Dispose of any resources that can be recreated.
+ }
+
+
+}
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/en.lproj/LaunchScreen.xib b/ios/LibreOfficeLight/LibreOfficeLight/en.lproj/LaunchScreen.xib
new file mode 100644
index 000000000..fa0ccf2ff
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/en.lproj/LaunchScreen.xib
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
+ <device id="retina4_7" orientation="portrait">
+ <adaptation id="fullscreen"/>
+ </device>
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="iN0-l3-epB">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="LibreOfficeLight" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
+ <rect key="frame" x="15" y="235" width="450" height="43"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="LibreOfficeLight is part of LibreOffice" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
+ <rect key="frame" x="15" y="293" width="450" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="https://www.libreoffice.org/get-help/community-support" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="6sz-Sz-e1h">
+ <rect key="frame" x="15" y="423" width="450" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="git://anongit.freedesktop.org/libreoffice/core" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="I4U-tD-bDs">
+ <rect key="frame" x="15" y="371" width="450" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Maintained by Jan Iversen and Jon Nermut" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jCj-XE-D37">
+ <rect key="frame" x="15" y="319" width="450" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="User support and development:" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="LOF-2P-X0o">
+ <rect key="frame" x="15" y="397" width="450" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="libreoffice@lists.freedesktop.org" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="h8D-4s-nQh">
+ <rect key="frame" x="15" y="449" width="450" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Full source is available at:" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="R3A-1h-X3D">
+ <rect key="frame" x="15" y="345" width="450" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" image="intro" translatesAutoresizingMaskIntoConstraints="NO" id="iba-PG-iZB">
+ <rect key="frame" x="5" y="20" width="470" height="128"/>
+ </imageView>
+ </subviews>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <constraints>
+ <constraint firstItem="I4U-tD-bDs" firstAttribute="top" secondItem="R3A-1h-X3D" secondAttribute="bottom" constant="5" id="1MI-gV-daV"/>
+ <constraint firstItem="h8D-4s-nQh" firstAttribute="top" secondItem="6sz-Sz-e1h" secondAttribute="bottom" constant="5" id="76h-os-PqN"/>
+ <constraint firstAttribute="trailing" secondItem="jCj-XE-D37" secondAttribute="trailing" constant="15" id="DmL-rk-YcF"/>
+ <constraint firstAttribute="bottom" secondItem="h8D-4s-nQh" secondAttribute="bottom" constant="10" id="ESJ-gH-xnX"/>
+ <constraint firstAttribute="trailing" secondItem="I4U-tD-bDs" secondAttribute="trailing" constant="15" id="EgU-Wx-Hpw"/>
+ <constraint firstItem="I4U-tD-bDs" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="Glv-5u-Qk4"/>
+ <constraint firstItem="LOF-2P-X0o" firstAttribute="top" secondItem="I4U-tD-bDs" secondAttribute="bottom" constant="5" id="H6a-qQ-p4a"/>
+ <constraint firstAttribute="trailing" secondItem="LOF-2P-X0o" secondAttribute="trailing" constant="15" id="J28-1n-Fgm"/>
+ <constraint firstItem="6sz-Sz-e1h" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="Jmn-sO-AVf"/>
+ <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="Qvq-TN-GGX"/>
+ <constraint firstAttribute="trailing" secondItem="iba-PG-iZB" secondAttribute="trailing" constant="5" id="SQG-Oy-orw"/>
+ <constraint firstItem="LOF-2P-X0o" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="T6B-k2-ejO"/>
+ <constraint firstItem="R3A-1h-X3D" firstAttribute="top" secondItem="jCj-XE-D37" secondAttribute="bottom" constant="5" id="Vzd-4l-NiA"/>
+ <constraint firstItem="h8D-4s-nQh" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="Wdb-nn-wdr"/>
+ <constraint firstAttribute="trailing" secondItem="6sz-Sz-e1h" secondAttribute="trailing" constant="15" id="ZCQ-vB-oHx"/>
+ <constraint firstAttribute="trailing" secondItem="kId-c2-rCX" secondAttribute="trailing" constant="15" id="ZvJ-2e-0hE"/>
+ <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="cDT-4h-Rbh"/>
+ <constraint firstAttribute="trailing" secondItem="R3A-1h-X3D" secondAttribute="trailing" constant="15" id="dcX-7M-2kQ"/>
+ <constraint firstItem="8ie-xW-0ye" firstAttribute="top" secondItem="kId-c2-rCX" secondAttribute="bottom" constant="15" id="ftR-wj-GaQ"/>
+ <constraint firstItem="jCj-XE-D37" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="hTT-gF-WpT"/>
+ <constraint firstItem="R3A-1h-X3D" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="hbP-Wj-hgc"/>
+ <constraint firstItem="iba-PG-iZB" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="20" id="jwj-qG-D6R"/>
+ <constraint firstItem="jCj-XE-D37" firstAttribute="top" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="5" id="nW0-DF-i3G"/>
+ <constraint firstAttribute="trailing" secondItem="h8D-4s-nQh" secondAttribute="trailing" constant="15" id="nz0-e0-vfD"/>
+ <constraint firstItem="kId-c2-rCX" firstAttribute="top" secondItem="iba-PG-iZB" secondAttribute="bottom" constant="8" symbolic="YES" id="ogG-Lo-8Ep"/>
+ <constraint firstAttribute="trailing" secondItem="8ie-xW-0ye" secondAttribute="trailing" constant="15" id="qKd-9S-EKe"/>
+ <constraint firstItem="6sz-Sz-e1h" firstAttribute="top" secondItem="LOF-2P-X0o" secondAttribute="bottom" constant="5" id="tdi-EJ-KXm"/>
+ <constraint firstItem="iba-PG-iZB" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="5" id="uoy-a0-Eez"/>
+ </constraints>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <point key="canvasLocation" x="548" y="455"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="intro" width="500" height="128"/>
+ </resources>
+</document>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/en.lproj/Main.storyboard b/ios/LibreOfficeLight/LibreOfficeLight/en.lproj/Main.storyboard
new file mode 100644
index 000000000..ffd5059d0
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/en.lproj/Main.storyboard
@@ -0,0 +1,501 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="DGj-7d-jfR">
+ <device id="ipad9_7" orientation="portrait">
+ <adaptation id="fullscreen"/>
+ </device>
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
+ <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
+ <capability name="Navigation items with more than one left or right bar item" minToolsVersion="7.0"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--Document-->
+ <scene sceneID="ufC-wZ-h7g">
+ <objects>
+ <viewController storyboardIdentifier="Document" useStoryboardIdentifierAsRestorationIdentifier="YES" id="vXZ-lx-hvc" customClass="DocumentController" customModule="LibreOfficeLight" customModuleProvider="target" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="lZa-u5-V0W"/>
+ <viewControllerLayoutGuide type="bottom" id="uE0-fS-86O"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" minimumZoomScale="0.5" maximumZoomScale="8" translatesAutoresizingMaskIntoConstraints="NO" id="cJ7-wO-9D1">
+ <rect key="frame" x="0.0" y="64" width="768" height="960"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <connections>
+ <outlet property="delegate" destination="vXZ-lx-hvc" id="mWv-AB-k2W"/>
+ </connections>
+ </scrollView>
+ <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8HF-MM-fd0" userLabel="ButtonBar" customClass="ButtonScrollView" customModule="LibreOfficeLight" customModuleProvider="target">
+ <rect key="frame" x="0.0" y="980" width="768" height="44"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </view>
+ <view opaque="NO" userInteractionEnabled="NO" alpha="0.5" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="URZ-zU-xtO" userLabel="Mask">
+ <rect key="frame" x="0.0" y="64" width="768" height="960"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" fixedFrame="YES" progressViewStyle="bar" translatesAutoresizingMaskIntoConstraints="NO" id="hRJ-mR-Vnv">
+ <rect key="frame" x="309" y="479" width="150" height="1.5"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES"/>
+ </progressView>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </view>
+ <searchBar hidden="YES" contentMode="redraw" fixedFrame="YES" placeholder="Search for text" showsCancelButton="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Aq0-4K-7FT">
+ <rect key="frame" x="0.0" y="64" width="768" height="56"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <textInputTraits key="textInputTraits"/>
+ <connections>
+ <outlet property="delegate" destination="vXZ-lx-hvc" id="bZ5-fa-vQ6"/>
+ </connections>
+ </searchBar>
+ </subviews>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </view>
+ <toolbarItems/>
+ <navigationItem key="navigationItem" title="Document" id="5c6-32-T4J">
+ <barButtonItem key="leftBarButtonItem" image="menu" id="fdq-Uw-536" userLabel="Button Properties">
+ <connections>
+ <action selector="doProperties:" destination="vXZ-lx-hvc" id="mHw-Uf-vh2"/>
+ </connections>
+ </barButtonItem>
+ <rightBarButtonItems>
+ <barButtonItem systemItem="action" id="BNq-ol-ZVK">
+ <connections>
+ <segue destination="IER-X5-Ax8" kind="popoverPresentation" identifier="showActions" popoverAnchorBarButtonItem="BNq-ol-ZVK" id="xmZ-1A-ZrW">
+ <popoverArrowDirection key="popoverArrowDirection" up="YES" down="YES" left="YES" right="YES"/>
+ </segue>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="search" id="3s2-a6-9gP">
+ <connections>
+ <action selector="searchIconTapped:" destination="vXZ-lx-hvc" id="tSY-uz-ifH"/>
+ </connections>
+ </barButtonItem>
+ </rightBarButtonItems>
+ </navigationItem>
+ <simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
+ <connections>
+ <outlet property="buttonScrollView" destination="8HF-MM-fd0" id="Mlq-CV-p8N"/>
+ <outlet property="mask" destination="URZ-zU-xtO" id="pkw-v3-0gr"/>
+ <outlet property="progressBar" destination="hRJ-mR-Vnv" id="4lJ-kG-9SW"/>
+ <outlet property="scrollView" destination="cJ7-wO-9D1" id="U50-LO-plb"/>
+ <outlet property="searchBar" destination="Aq0-4K-7FT" id="B3A-Ck-UdD"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="1230.46875" y="303.515625"/>
+ </scene>
+ <!--Print Manager-->
+ <scene sceneID="viJ-XJ-htc">
+ <objects>
+ <viewController storyboardIdentifier="PrintManager" useStoryboardIdentifierAsRestorationIdentifier="YES" id="ay1-ce-WHs" customClass="ViewPrintManager" customModule="LibreOfficeLight" customModuleProvider="target" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="N2T-Vd-NX5"/>
+ <viewControllerLayoutGuide type="bottom" id="pxU-MS-J0z"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="uQ6-KY-cCv">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="My Print Manager" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cbo-NR-JZi">
+ <rect key="frame" x="175" y="386" width="156" height="21"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <nil key="textColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </view>
+ <toolbarItems/>
+ <navigationItem key="navigationItem" title="Print Manager" id="2Z5-ad-smF">
+ <barButtonItem key="leftBarButtonItem" image="menu" id="KpY-Uq-nOk">
+ <connections>
+ <action selector="doProperties:" destination="ay1-ce-WHs" id="abP-LB-4yO"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
+ <simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="S7J-dT-DQn" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="1230" y="-458"/>
+ </scene>
+ <!--Navigation Controller-->
+ <scene sceneID="nrt-yR-DmY">
+ <objects>
+ <navigationController automaticallyAdjustsScrollViewInsets="NO" id="DGj-7d-jfR" sceneMemberID="viewController">
+ <toolbarItems/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" barStyle="black" id="mjw-Ry-qIh">
+ <rect key="frame" x="0.0" y="20" width="768" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <color key="tintColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <color key="barTintColor" red="0.0" green="0.58367598684210531" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <textAttributes key="titleTextAttributes">
+ <fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="20"/>
+ <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </textAttributes>
+ </navigationBar>
+ <nil name="viewControllers"/>
+ <connections>
+ <segue destination="h7c-B7-pKT" kind="show" identifier="showProperties" id="dDf-1s-0HH"/>
+ <segue destination="ay1-ce-WHs" kind="show" identifier="showPrintManager" id="BgL-QR-QJ0"/>
+ <segue destination="vXZ-lx-hvc" kind="relationship" relationship="rootViewController" id="ONR-Tq-ptF"/>
+ </connections>
+ </navigationController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="XfU-3W-Qcb" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="259.19999999999999" y="305.84707646176912"/>
+ </scene>
+ <!--Properties Controller-->
+ <scene sceneID="moB-At-Om8">
+ <objects>
+ <viewController storyboardIdentifier="PropertiesController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="E9y-3m-fEc" userLabel="Properties Controller" customClass="PropertiesController" customModule="LibreOfficeLight" customModuleProvider="target" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="qJv-1E-iEi"/>
+ <viewControllerLayoutGuide type="bottom" id="syI-80-ufe"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="e1u-sT-aSe">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="g5y-SJ-jU1">
+ <rect key="frame" x="20" y="84" width="69" height="45"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="45" id="GiU-Zv-tSK"/>
+ </constraints>
+ <inset key="titleEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Style1" image="document">
+ <color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
+ </state>
+ <connections>
+ <action selector="doStyle1:" destination="E9y-3m-fEc" eventType="touchUpInside" id="Tvz-2x-oik"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YTV-Y5-L8R">
+ <rect key="frame" x="20" y="139" width="71" height="45"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="45" id="6Nn-8E-Eun"/>
+ </constraints>
+ <inset key="titleEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Style2" image="document">
+ <color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
+ </state>
+ <connections>
+ <action selector="doStyle2:" destination="E9y-3m-fEc" eventType="touchUpInside" id="u7L-s5-vmD"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="eZV-Rh-hCf">
+ <rect key="frame" x="20" y="194" width="72" height="45"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="45" id="aVx-Vb-bZq"/>
+ </constraints>
+ <inset key="titleEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Style3" image="document">
+ <color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
+ </state>
+ <connections>
+ <action selector="doStyle3:" destination="E9y-3m-fEc" eventType="touchUpInside" id="t2Q-iq-Exh"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="CBj-V3-BKJ">
+ <rect key="frame" x="20" y="249" width="72" height="45"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="45" id="RLA-17-w0s"/>
+ </constraints>
+ <inset key="titleEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Style4" image="document">
+ <color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
+ </state>
+ <connections>
+ <action selector="doStyle4:" destination="E9y-3m-fEc" eventType="touchUpInside" id="x4U-Gg-ylt"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Hk4-yl-lM9">
+ <rect key="frame" x="20" y="304" width="72" height="45"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="45" id="AEu-v6-MfG"/>
+ </constraints>
+ <inset key="titleEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Style5" image="document">
+ <color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
+ </state>
+ <connections>
+ <action selector="doStyle5:" destination="E9y-3m-fEc" eventType="touchUpInside" id="o3m-zn-dyf"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="K3a-CQ-sBC">
+ <rect key="frame" x="20" y="359" width="72" height="45"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="45" id="fyO-4v-nFF"/>
+ </constraints>
+ <inset key="titleEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Style6" image="document">
+ <color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
+ </state>
+ <connections>
+ <action selector="doStyle6:" destination="E9y-3m-fEc" eventType="touchUpInside" id="t58-52-FY4"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5Mv-7b-xjF">
+ <rect key="frame" x="20" y="414" width="70" height="45"/>
+ <inset key="titleEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Style7" image="document">
+ <color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
+ </state>
+ <connections>
+ <action selector="doStyle7:" destination="E9y-3m-fEc" eventType="touchUpInside" id="cNb-al-UOa"/>
+ </connections>
+ </button>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="eZV-Rh-hCf" firstAttribute="top" secondItem="YTV-Y5-L8R" secondAttribute="bottom" constant="10" id="8MW-wy-3mP"/>
+ <constraint firstItem="YTV-Y5-L8R" firstAttribute="leading" secondItem="g5y-SJ-jU1" secondAttribute="leading" id="GdK-zW-XUW"/>
+ <constraint firstItem="syI-80-ufe" firstAttribute="top" secondItem="5Mv-7b-xjF" secondAttribute="bottom" constant="565" id="H6C-1e-7UE"/>
+ <constraint firstItem="5Mv-7b-xjF" firstAttribute="leading" secondItem="e1u-sT-aSe" secondAttribute="leadingMargin" id="NnF-fS-TRc"/>
+ <constraint firstItem="CBj-V3-BKJ" firstAttribute="leading" secondItem="eZV-Rh-hCf" secondAttribute="leading" id="Nts-Pq-gbT"/>
+ <constraint firstItem="Hk4-yl-lM9" firstAttribute="top" secondItem="CBj-V3-BKJ" secondAttribute="bottom" constant="10" id="Qjz-bp-Zdz"/>
+ <constraint firstItem="CBj-V3-BKJ" firstAttribute="top" secondItem="eZV-Rh-hCf" secondAttribute="bottom" constant="10" id="TqY-lf-jld"/>
+ <constraint firstItem="Hk4-yl-lM9" firstAttribute="leading" secondItem="CBj-V3-BKJ" secondAttribute="leading" id="X9n-Bn-V0R"/>
+ <constraint firstItem="eZV-Rh-hCf" firstAttribute="leading" secondItem="YTV-Y5-L8R" secondAttribute="leading" id="XFl-0W-rjg"/>
+ <constraint firstItem="K3a-CQ-sBC" firstAttribute="top" secondItem="Hk4-yl-lM9" secondAttribute="bottom" constant="10" id="guC-5D-obv"/>
+ <constraint firstItem="K3a-CQ-sBC" firstAttribute="leading" secondItem="Hk4-yl-lM9" secondAttribute="leading" id="jpn-3d-FRp"/>
+ <constraint firstItem="5Mv-7b-xjF" firstAttribute="top" secondItem="K3a-CQ-sBC" secondAttribute="bottom" constant="10" id="ozy-Rl-tAb"/>
+ <constraint firstItem="5Mv-7b-xjF" firstAttribute="leading" secondItem="K3a-CQ-sBC" secondAttribute="leading" id="sHO-T6-sUz"/>
+ <constraint firstItem="YTV-Y5-L8R" firstAttribute="top" secondItem="g5y-SJ-jU1" secondAttribute="bottom" constant="10" id="v9r-Th-jAf"/>
+ <constraint firstItem="g5y-SJ-jU1" firstAttribute="top" secondItem="qJv-1E-iEi" secondAttribute="bottom" constant="64" id="wPY-qL-9aw"/>
+ </constraints>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="wg5-HE-6LR" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-612" y="304.4977511244378"/>
+ </scene>
+ <!--Properties-->
+ <scene sceneID="XNm-Ch-28q">
+ <objects>
+ <viewController storyboardIdentifier="Properties" title="Properties" useStoryboardIdentifierAsRestorationIdentifier="YES" id="h7c-B7-pKT" customClass="ViewProperties" customModule="LibreOfficeLight" customModuleProvider="target" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="VKw-5g-PNK"/>
+ <viewControllerLayoutGuide type="bottom" id="BiA-CR-Pte"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="Z9n-50-7Jf">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="My Properties" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Jt-Yy-kcR">
+ <rect key="frame" x="166" y="484" width="142" height="21"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <nil key="textColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="vaO-NX-hiP" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-447" y="-745"/>
+ </scene>
+ <!--Document Actions-->
+ <scene sceneID="U7J-9A-X5o">
+ <objects>
+ <tableViewController autoresizesArchivedViewToFullSize="NO" title="Document Actions" automaticallyAdjustsScrollViewInsets="NO" modalTransitionStyle="crossDissolve" modalPresentationStyle="overCurrentContext" clearsSelectionOnViewWillAppear="NO" id="IER-X5-Ax8" customClass="DocumentActions" customModule="LibreOfficeLight" customModuleProvider="target" sceneMemberID="viewController">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="30" sectionHeaderHeight="28" sectionFooterHeight="28" id="RqF-IL-YJc">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="210"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <sections>
+ <tableViewSection id="iZc-fF-wRk">
+ <cells>
+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="VNE-JL-Lw0">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="30"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="VNE-JL-Lw0" id="EB2-HA-y79">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="29.5"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" tag="1" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="myk-zs-md7">
+ <rect key="frame" x="8" y="0.0" width="118" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <accessibility key="accessibilityConfiguration">
+ <bool key="isElement" value="NO"/>
+ </accessibility>
+ <state key="normal" title="Open..."/>
+ <connections>
+ <action selector="actionMenuSelect:" destination="IER-X5-Ax8" eventType="touchUpInside" id="0gI-or-ji2"/>
+ </connections>
+ </button>
+ </subviews>
+ </tableViewCellContentView>
+ </tableViewCell>
+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="XW7-H5-0ob">
+ <rect key="frame" x="0.0" y="30" width="134" height="30"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="XW7-H5-0ob" id="lJN-OL-mO8">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="29.5"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" tag="2" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="b90-ja-Wm0" userLabel="Button Properties">
+ <rect key="frame" x="8" y="0.0" width="118" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <accessibility key="accessibilityConfiguration" identifier="actionSave">
+ <bool key="isElement" value="NO"/>
+ </accessibility>
+ <state key="normal" title="Properties"/>
+ <connections>
+ <action selector="actionMenuSelect:" destination="IER-X5-Ax8" eventType="touchUpInside" id="ErC-4Q-0we"/>
+ </connections>
+ </button>
+ </subviews>
+ </tableViewCellContentView>
+ </tableViewCell>
+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Osp-RA-lhK">
+ <rect key="frame" x="0.0" y="60" width="134" height="30"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Osp-RA-lhK" id="mU4-Wv-5dR">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="29.5"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" tag="3" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="m45-MR-Gca" userLabel="Button Save">
+ <rect key="frame" x="8" y="0.0" width="118" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <accessibility key="accessibilityConfiguration" identifier="actionSave">
+ <bool key="isElement" value="NO"/>
+ </accessibility>
+ <state key="normal" title="Save"/>
+ <connections>
+ <action selector="actionMenuSelect:" destination="IER-X5-Ax8" eventType="touchUpInside" id="pXt-Kb-Vjw"/>
+ </connections>
+ </button>
+ </subviews>
+ </tableViewCellContentView>
+ </tableViewCell>
+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Kys-Iw-SeT">
+ <rect key="frame" x="0.0" y="90" width="134" height="30"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Kys-Iw-SeT" id="2C9-6w-WS3">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="29.5"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" tag="4" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="95N-Hk-rcU" userLabel="Button Close">
+ <rect key="frame" x="8" y="0.0" width="118" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <accessibility key="accessibilityConfiguration" identifier="actionSave">
+ <bool key="isElement" value="NO"/>
+ </accessibility>
+ <state key="normal" title="Close"/>
+ <connections>
+ <action selector="actionMenuSelect:" destination="IER-X5-Ax8" eventType="touchUpInside" id="lIq-w7-Yr5"/>
+ </connections>
+ </button>
+ </subviews>
+ </tableViewCellContentView>
+ </tableViewCell>
+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="AN7-6j-wO7">
+ <rect key="frame" x="0.0" y="120" width="134" height="30"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="AN7-6j-wO7" id="kl1-nQ-aIu">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="29.5"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" tag="5" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6vH-aM-aYe" userLabel="Button Save copy">
+ <rect key="frame" x="8" y="0.0" width="118" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <accessibility key="accessibilityConfiguration">
+ <bool key="isElement" value="NO"/>
+ </accessibility>
+ <state key="normal" title="Save copy..."/>
+ <connections>
+ <action selector="actionMenuSelect:" destination="IER-X5-Ax8" eventType="touchUpInside" id="KBW-3d-D5Z"/>
+ </connections>
+ </button>
+ </subviews>
+ </tableViewCellContentView>
+ </tableViewCell>
+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="GmK-gj-GYu">
+ <rect key="frame" x="0.0" y="150" width="134" height="30"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="GmK-gj-GYu" id="3OK-Zz-mqN">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="29.5"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" tag="6" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="apE-3B-lUt" userLabel="Button Save As PDF">
+ <rect key="frame" x="8" y="0.0" width="118" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <accessibility key="accessibilityConfiguration" identifier="actionSaveAsPDF">
+ <bool key="isElement" value="NO"/>
+ </accessibility>
+ <state key="normal" title="Save as PDF"/>
+ <connections>
+ <action selector="actionMenuSelect:" destination="IER-X5-Ax8" eventType="touchUpInside" id="0gI-or-ji5"/>
+ </connections>
+ </button>
+ </subviews>
+ </tableViewCellContentView>
+ </tableViewCell>
+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="diN-3v-tgm">
+ <rect key="frame" x="0.0" y="180" width="134" height="30"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="diN-3v-tgm" id="24s-fs-4cw">
+ <rect key="frame" x="0.0" y="0.0" width="134" height="29.5"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" tag="7" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tvH-WR-c61" userLabel="Button Print">
+ <rect key="frame" x="8" y="0.0" width="118" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <accessibility key="accessibilityConfiguration">
+ <bool key="isElement" value="NO"/>
+ </accessibility>
+ <state key="normal" title="Print..."/>
+ <connections>
+ <action selector="actionMenuSelect:" destination="IER-X5-Ax8" eventType="touchUpInside" id="saH-6n-BkX"/>
+ </connections>
+ </button>
+ </subviews>
+ </tableViewCellContentView>
+ </tableViewCell>
+ </cells>
+ </tableViewSection>
+ </sections>
+ <connections>
+ <outlet property="dataSource" destination="IER-X5-Ax8" id="BBZ-8e-Waf"/>
+ <outlet property="delegate" destination="IER-X5-Ax8" id="sji-7W-aF0"/>
+ </connections>
+ </tableView>
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <value key="contentSizeForViewInPopover" type="size" width="134" height="210"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <nil key="simulatedTopBarMetrics"/>
+ <nil key="simulatedBottomBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <size key="freeformSize" width="134" height="210"/>
+ <connections>
+ <outlet property="buttonClose" destination="95N-Hk-rcU" id="hJo-Qc-Wgv"/>
+ <outlet property="buttonOpen" destination="myk-zs-md7" id="xQK-I1-pDl"/>
+ <outlet property="buttonPrint" destination="tvH-WR-c61" id="4YU-p2-Fim"/>
+ <outlet property="buttonProperties" destination="b90-ja-Wm0" id="scY-Fn-fss"/>
+ <outlet property="buttonSave" destination="m45-MR-Gca" id="UZw-LX-Bco"/>
+ <outlet property="buttonSaveAs" destination="6vH-aM-aYe" id="4KY-Zi-iH4"/>
+ <outlet property="buttonSaveAsPDF" destination="apE-3B-lUt" id="AZL-ON-v2Y"/>
+ </connections>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="D6j-Ov-CSK" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="1799" y="303"/>
+ </scene>
+ </scenes>
+ <resources>
+ <image name="document" width="20" height="20"/>
+ <image name="menu" width="22" height="22"/>
+ </resources>
+</document>
diff --git a/ios/LibreOfficeLight/LibreOfficeLight/lokit-Bridging-Header.h b/ios/LibreOfficeLight/LibreOfficeLight/lokit-Bridging-Header.h
new file mode 100644
index 000000000..67feadb80
--- /dev/null
+++ b/ios/LibreOfficeLight/LibreOfficeLight/lokit-Bridging-Header.h
@@ -0,0 +1,16 @@
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+
+
+// LibreOfficeKit is a prelink of all used LO libraries, generated
+// as its own xCode project.
+#define LOK_USE_UNSTABLE_API
+#import "../../source/LibreOfficeKit.h"
+
+void temporaryHackToInvokeCallbackHandlers(LibreOfficeKitDocument* pThis);