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