diff options
Diffstat (limited to '')
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 Binary files differnew file mode 100644 index 000000000..e25eb6bdd --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-1024.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-120.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-120.png Binary files differnew file mode 100644 index 000000000..49a7a1070 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-120.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-152.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-152.png Binary files differnew file mode 100644 index 000000000..9a204a930 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-152.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-167.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-167.png Binary files differnew file mode 100644 index 000000000..ef0033f9a --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-167.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-180.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-180.png Binary files differnew file mode 100644 index 000000000..2fdcb30dc --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-180.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-20.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-20.png Binary files differnew file mode 100644 index 000000000..ba82eb87b --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-20.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-29.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-29.png Binary files differnew file mode 100644 index 000000000..5a03ed3f4 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-29.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-40.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-40.png Binary files differnew file mode 100644 index 000000000..1fefbff4b --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-40.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-58.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-58.png Binary files differnew file mode 100644 index 000000000..cd6cf1338 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-58.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-60.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-60.png Binary files differnew file mode 100644 index 000000000..00774322c --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-60.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-76.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-76.png Binary files differnew file mode 100644 index 000000000..879629fc8 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-76.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-80.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-80.png Binary files differnew file mode 100644 index 000000000..1ae49c48c --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-80.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-87.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-87.png Binary files differnew file mode 100644 index 000000000..679f6abc0 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/AppIcon.appiconset/LibreOffice-87.png 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 Binary files differnew file mode 100644 index 000000000..0b9776a64 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@2x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@2x.png Binary files differnew file mode 100644 index 000000000..6e7c3995d --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@2x.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@3x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@3x.png Binary files differnew file mode 100644 index 000000000..e66980cdd --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/back.imageset/back@3x.png 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 Binary files differnew file mode 100644 index 000000000..64c373eca --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing-template.dataset/drawing-template.icns 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 Binary files differnew file mode 100644 index 000000000..d179d041a --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/drawing.dataset/drawing.icns 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 Binary files differnew file mode 100644 index 000000000..ec11e8fe5 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-document.dataset/empty-document.ico 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 Binary files differnew file mode 100644 index 000000000..ec11e8fe5 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/empty-template.dataset/empty-template.ico 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 Binary files differnew file mode 100644 index 000000000..cec1b92c3 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/extension.dataset/extension.icns 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 Binary files differnew file mode 100644 index 000000000..f6dc58809 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/formula.dataset/formula.icns 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 Binary files differnew file mode 100644 index 000000000..c3e1bf693 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/main.dataset/main.icns 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 Binary files differnew file mode 100644 index 000000000..4b0cf1bb7 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/master-document.dataset/master-document.icns 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 Binary files differnew file mode 100644 index 000000000..e523fdd9d --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-database.dataset/oasis-database.icns 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 Binary files differnew file mode 100644 index 000000000..9991270a5 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing-template.dataset/oasis-drawing-template.ico 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 Binary files differnew file mode 100644 index 000000000..64563d257 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-drawing.dataset/oasis-drawing.icns 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 Binary files differnew file mode 100644 index 000000000..07b3e8ecf --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-formula.dataset/oasis-formula.ico 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 Binary files differnew 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 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 Binary files differnew file mode 100644 index 000000000..0ac9681b1 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-master-document.dataset/oasis-master-document.ico 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 Binary files differnew file mode 100644 index 000000000..6bf52a184 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation-template.dataset/oasis-presentation-template.icns 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 Binary files differnew file mode 100644 index 000000000..0845cad87 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-presentation.dataset/oasis-presentation.ico 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 Binary files differnew file mode 100644 index 000000000..d21737853 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet-template.dataset/oasis-spreadsheet-template.icns 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 Binary files differnew file mode 100644 index 000000000..95cc98b34 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-spreadsheet.dataset/oasis-spreadsheet.icns 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 Binary files differnew file mode 100644 index 000000000..71136e778 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text-template.dataset/oasis-text-template.ico 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 Binary files differnew file mode 100644 index 000000000..70210b0ec --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-text.dataset/oasis-text.ico 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 Binary files differnew file mode 100644 index 000000000..06fcd5ad1 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/oasis-web-template.dataset/oasis-web-template.icns 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 Binary files differnew file mode 100644 index 000000000..ec11e8fe5 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/open.dataset/open.ico 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 Binary files differnew file mode 100644 index 000000000..b24847495 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation-template.dataset/presentation-template.ico 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 Binary files differnew file mode 100644 index 000000000..0845cad87 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/presentation.dataset/presentation.ico 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 Binary files differnew file mode 100644 index 000000000..ec11e8fe5 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/soffice.dataset/soffice.ico 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 Binary files differnew file mode 100644 index 000000000..f527a14b7 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet-template.dataset/spreadsheet-template.icns 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 Binary files differnew file mode 100644 index 000000000..9d61c699c --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/spreadsheet.dataset/spreadsheet.icns 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 Binary files differnew file mode 100644 index 000000000..accd48b9b --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text-template.dataset/text-template.icns 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 Binary files differnew file mode 100644 index 000000000..9b7a301ee --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/document.icons/text.dataset/text.icns 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 Binary files differnew file mode 100644 index 000000000..d27f8858d --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/intro.imageset/intro.png 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 Binary files differnew file mode 100644 index 000000000..fe97b0cfe --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@2x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@2x.png Binary files differnew file mode 100644 index 000000000..f5e9a1597 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@2x.png diff --git a/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@3x.png b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@3x.png Binary files differnew file mode 100644 index 000000000..9f00717fe --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Assets.xcassets/menu.imageset/menu@3x.png 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 Binary files differnew file mode 100644 index 000000000..8cd87b9d6 --- /dev/null +++ b/ios/LibreOfficeLight/LibreOfficeLight/Settings.bundle/en.lproj/Root.strings 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); |