Retire the bit-rotting LibreOfficeLight iOS app
Change-Id: I21b8055fc97d8dfb8429e7dafa1a3982c3b7499b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108122 Tested-by: Tor Lillqvist <tml@collabora.com> Reviewed-by: Tor Lillqvist <tml@collabora.com>
|
@ -164,7 +164,6 @@ export ENABLE_GSTREAMER_1_0=@ENABLE_GSTREAMER_1_0@
|
|||
export ENABLE_GTK3=@ENABLE_GTK3@
|
||||
export DISABLE_GUI=@DISABLE_GUI@
|
||||
export ENABLE_HTMLHELP=@ENABLE_HTMLHELP@
|
||||
export ENABLE_IOS_LIBREOFFICELIGHT_APP=@ENABLE_IOS_LIBREOFFICELIGHT_APP@
|
||||
export ENABLE_JAVA=@ENABLE_JAVA@
|
||||
export ENABLE_LDAP=@ENABLE_LDAP@
|
||||
export ENABLE_LPSOLVE=@ENABLE_LPSOLVE@
|
||||
|
|
13
configure.ac
|
@ -1263,19 +1263,6 @@ AC_ARG_ENABLE(ios-simulator,
|
|||
[build for iOS simulator])
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE(ios-libreofficelight-app,
|
||||
AS_HELP_STRING([--enable-ios-libreofficelight-app],
|
||||
[When building for iOS, build stuff relevant only for the 'LibreOfficeLight' app
|
||||
(in ios/LibreOfficeLight). Note that this app is not known to work in any useful manner,
|
||||
and also that its actual build (in Xcode) requires some obvious modifications to the project.])
|
||||
)
|
||||
|
||||
ENABLE_IOS_LIBREOFFICELIGHT_APP=
|
||||
if test "$enable_ios_libreofficelight_app" = yes; then
|
||||
ENABLE_IOS_LIBREOFFICELIGHT_APP=TRUE
|
||||
fi
|
||||
AC_SUBST(ENABLE_IOS_LIBREOFFICELIGHT_APP)
|
||||
|
||||
###############################################################################
|
||||
# Extensions switches --enable/--disable
|
||||
###############################################################################
|
||||
|
|
9
ios/.gitignore
vendored
|
@ -1,9 +0,0 @@
|
|||
#
|
||||
# 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
|
|
@ -1,90 +0,0 @@
|
|||
# -*- 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),AARCH64)
|
||||
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:
|
|
@ -1,11 +0,0 @@
|
|||
******
|
||||
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
|
|
@ -1,635 +0,0 @@
|
|||
// !$*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;
|
||||
LO_CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
LO_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;
|
||||
LO_CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
LO_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 */;
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
<?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>
|
|
@ -1,91 +0,0 @@
|
|||
<?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>
|
|
@ -1,117 +0,0 @@
|
|||
//
|
||||
// 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()
|
||||
}
|
||||
}
|
||||
|
|
@ -1,116 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.6 KiB |
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 805 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.8 KiB |
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "drawing-template.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "drawing.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "empty-document.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 34 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "empty-template.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 34 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "extension.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "formula.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "main.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "master-document.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-database.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-drawing-template.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 57 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-drawing.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-formula.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 46 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-master-document-template.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-master-document.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 38 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-presentation-template.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-presentation.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 44 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-spreadsheet-template.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-spreadsheet.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-text-template.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 54 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-text.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 45 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "oasis-web-template.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "open.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 34 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "presentation-template.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 53 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "presentation.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 44 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "soffice.ico"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 34 KiB |
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "spreadsheet-template.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "spreadsheet.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "text-template.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
},
|
||||
"data" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "text.icns"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 69 KiB |
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 586 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 722 B |
|
@ -1,145 +0,0 @@
|
|||
//
|
||||
// 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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
//
|
||||
// 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)
|
||||
}
|
||||
|
|
@ -1,598 +0,0 @@
|
|||
//
|
||||
// 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 existingView = self.documentView
|
||||
{
|
||||
existingView.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.isSpreadsheet
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
//
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,244 +0,0 @@
|
|||
//
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
//
|
||||
// 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
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,592 +0,0 @@
|
|||
//
|
||||
// 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 getPartRectangles() -> 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
|
||||
}
|
||||
}
|
||||
|