libreoffice-online/ios/Mobile/TemplateCollectionViewController.mm
Tor Lillqvist 3e5f1d9537 Don't let the TemplateCollectionViewController be dismissed
A quick workaround for https://github.com/CollaboraOnline/online/issues/1433 .

Change-Id: I8d77df9858170cfa0cc9a4921e84cdb365aed1cf
Signed-off-by: Tor Lillqvist <tml@collabora.com>
2021-03-19 11:52:11 +02:00

157 lines
6.5 KiB
Text

// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*-
//
// 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 "svtools/strings.hrc"
#import <LibreOfficeKit/LibreOfficeKitInit.h>
#import "ios.h"
#import "AppDelegate.h"
#import "L10n.h"
#import "TemplateCollectionViewController.h"
#import "TemplateSectionHeaderView.h"
static NSString *mapTemplateExtensionToActual(NSString *templateName) {
NSString *baseName = [templateName stringByDeletingPathExtension];
NSString *extension = [templateName substringFromIndex:baseName.length];
if ([extension isEqualToString:@".ott"])
return [baseName stringByAppendingString:@".odt"];
else if ([extension isEqualToString:@".ots"])
return [baseName stringByAppendingString:@".ods"];
else if ([extension isEqualToString:@".otp"])
return [baseName stringByAppendingString:@".odp"];
else
assert(false);
}
@implementation TemplateCollectionViewController
- (void)viewDidLoad {
self.modalInPresentation = YES;
static NSString *downloadedTemplates = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"/downloadedTemplates/"];
// Scan for available templates. First downloaded ones.
NSDirectoryEnumerator<NSString *> *e = [[NSFileManager defaultManager] enumeratorAtPath:downloadedTemplates];
templates[0] = [@[] mutableCopy];
templates[1] = [@[] mutableCopy];
templates[2] = [@[] mutableCopy];
NSString *subPath;
while ((subPath = [e nextObject]) != nil) {
NSString *path = [downloadedTemplates stringByAppendingString:subPath];
if ([[path pathExtension] isEqualToString:@"ott"]) {
[templates[0] addObject:[NSURL fileURLWithPath:path]];
} else if ([[path pathExtension] isEqualToString:@"ots"]) {
[templates[1] addObject:[NSURL fileURLWithPath:path]];
} else if ([[path pathExtension] isEqualToString:@"otp"]) {
[templates[2] addObject:[NSURL fileURLWithPath:path]];
}
}
if ([templates[0] count] == 0)
templates[0] = [[[NSBundle mainBundle] URLsForResourcesWithExtension:@".ott" subdirectory:@"Templates"] mutableCopy];
if ([templates[1] count] == 0)
templates[1] = [[[NSBundle mainBundle] URLsForResourcesWithExtension:@".ots" subdirectory:@"Templates"] mutableCopy];
if ([templates[2] count] == 0)
templates[2] = [[[NSBundle mainBundle] URLsForResourcesWithExtension:@".otp" subdirectory:@"Templates"] mutableCopy];
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
// Three sections: Document, Spreadsheet, and Presentation
return 3;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
assert(section >= 0 && section <= 2);
return templates[section].count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
assert(indexPath.length == 2);
assert([indexPath indexAtPosition:0] <= 2);
assert([indexPath indexAtPosition:1] < templates[[indexPath indexAtPosition:0]].count);
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
UIImageView *image = (UIImageView *)[cell viewWithTag:1];
UILabel *title = (UILabel *)[cell viewWithTag:2];
NSString *templateThumbnail = [[templates[[indexPath indexAtPosition:0]][[indexPath indexAtPosition:1]] path] stringByAppendingString:@".png"];
UIImage *thumbnail;
if ([NSFileManager.defaultManager fileExistsAtPath:templateThumbnail])
thumbnail = [UIImage imageWithContentsOfFile:templateThumbnail];
else
thumbnail = [UIImage imageNamed:@"AppIcon"];
image.image = thumbnail;
NSString *fileName = [templates[[indexPath indexAtPosition:0]][[indexPath indexAtPosition:1]] lastPathComponent];
title.text = [fileName stringByDeletingPathExtension];
return cell;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(150, 150);
}
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
assert(kind == UICollectionElementKindSectionHeader);
assert(indexPath.length == 2);
assert([indexPath indexAtPosition:1] == 0);
NSUInteger index = [indexPath indexAtPosition:0];
assert(index <= 2);
TemplateSectionHeaderView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"SectionHeaderView" forIndexPath:indexPath];
char *translatedHeader;
if (index == 0)
translatedHeader = _(STR_DESCRIPTION_FACTORY_WRITER, "svt");
else if (index == 1)
translatedHeader = _(STR_DESCRIPTION_FACTORY_CALC, "svt");
else if (index == 2)
translatedHeader = _(STR_DESCRIPTION_FACTORY_IMPRESS, "svt");
else
abort();
header.title.text = [NSString stringWithUTF8String:translatedHeader];
free(translatedHeader);
return header;
}
- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath {
NSURL *selectedTemplate = templates[[indexPath indexAtPosition:0]][[indexPath indexAtPosition:1]];
NSURL *cacheDirectory = [NSFileManager.defaultManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask][0];
NSURL *newURL = [cacheDirectory URLByAppendingPathComponent:mapTemplateExtensionToActual(selectedTemplate.lastPathComponent)
isDirectory:NO];
// Load the template into LibreOffice core, save as the corresponding document type (with the
// same basename), and then proceed to edit that.
LibreOfficeKitDocument *doc = lo_kit->pClass->documentLoad(lo_kit, [[selectedTemplate absoluteString] UTF8String]);
doc->pClass->saveAs(doc, [[newURL absoluteString] UTF8String], nullptr, nullptr);
doc->pClass->destroy(doc);
self.importHandler(newURL, UIDocumentBrowserImportModeMove);
[self dismissViewControllerAnimated:YES completion:nil];
return YES;
}
@end
// vim:set shiftwidth=4 softtabstop=4 expandtab: