nextcloud-desktop/shell_integration/MacOSX/OwnCloudFinder/MenuManager.m
Jocelyn Turcotte 9797782682 shell_i: Build the extension with the '-' identity by default
This allows developers to build and run the extension by default.
Official packages bundles will be re-signed after the build, we

The SocketApi prefix can be set at configure time through cmake and
should match the key that will be used to sign the whole .app bundle
(including the embedded FindexSync .appex bundle).
2015-06-22 13:55:19 +02:00

188 lines
No EOL
5.7 KiB
Objective-C

/**
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
#import "MenuManager.h"
#import "Finder/Finder.h"
#import "RequestManager.h"
@implementation MenuManager
static MenuManager* sharedInstance = nil;
+ (MenuManager*)sharedInstance
{
@synchronized(self)
{
if (sharedInstance == nil)
{
sharedInstance = [[self alloc] init];
}
}
return sharedInstance;
}
- init
{
return [super init];
}
- (void)addChildrenSubMenuItems:(NSMenuItem*)parentMenuItem withChildren:(NSArray*)menuItemsDictionaries forFiles:(NSArray*)files
{
NSMenu* menu = [[NSMenu alloc] init];
for (int i = 0; i < [menuItemsDictionaries count]; ++i)
{
NSDictionary* menuItemDictionary = [menuItemsDictionaries objectAtIndex:i];
NSString* submenuTitle = [menuItemDictionary objectForKey:@"title"];
BOOL enabled = [[menuItemDictionary objectForKey:@"enabled"] boolValue];
NSString* uuid = [menuItemDictionary objectForKey:@"uuid"];
NSArray* childrenSubMenuItems = (NSArray*)[menuItemDictionary objectForKey:@"contextMenuItems"];
if ([submenuTitle isEqualToString:@"_SEPARATOR_"])
{
[menu addItem:[NSMenuItem separatorItem]];
}
else if (childrenSubMenuItems != nil && [childrenSubMenuItems count] != 0)
{
NSMenuItem* submenuItem = [menu addItemWithTitle:submenuTitle action:nil keyEquivalent:@""];
[self addChildrenSubMenuItems:submenuItem withChildren:childrenSubMenuItems forFiles:files];
}
else
{
[self createActionMenuItemIn:menu withTitle:submenuTitle withIndex:i enabled:enabled withUuid:uuid forFiles:files];
}
}
[parentMenuItem setSubmenu:menu];
[menu release];
}
- (void)addItemsToMenu:(TContextMenu*)menu forFiles:(NSArray*)files
{
OwnCloudFinderRequestManager *requestManager = [OwnCloudFinderRequestManager sharedInstance];
NSString *shareItemTitle = [requestManager shareItemTitle];
if (!shareItemTitle || shareItemTitle.length == 0) {
return;
}
for (int i = 0; i < files.count; i++) {
NSString *fn = [files objectAtIndex:i];
BOOL isDir = false;
if ([[NSFileManager defaultManager] fileExistsAtPath:fn isDirectory:&isDir]) {
if (![requestManager isRegisteredPath:fn isDirectory:isDir]) {
return;
}
}
}
NSMutableArray* menuItemsArray = [[[NSMutableArray alloc] init] autorelease];
NSMutableDictionary *firstEntry = [[[NSMutableDictionary alloc] init] autorelease];
[firstEntry setValue:[NSNumber numberWithBool:YES] forKey:@"enabled"];
[firstEntry setValue:shareItemTitle forKey:@"title"];
[menuItemsArray addObject:firstEntry];
// Find the menu with a submenu which should be the share menu position
NSInteger menuIndex = MIN(4, menu.itemArray.count);
for (int i = menuIndex; i < menu.itemArray.count; i++) {
if ([[menu itemAtIndex:i] hasSubmenu]) {
menuIndex = i;
//NSLog(@"addItemsToMenu: menuIndex --> %lu (count=%lu)", menuIndex, (unsigned long)menu.itemArray.count);
break;
}
}
for (int i = 0; i < [menuItemsArray count]; ++i)
{
NSDictionary* menuItemDictionary = [menuItemsArray objectAtIndex:i];
NSString* mainMenuTitle = [menuItemDictionary objectForKey:@"title"];
if ([mainMenuTitle isEqualToString:@""])
{
continue;
}
menuIndex++;
BOOL enabled = [[menuItemDictionary objectForKey:@"enabled"] boolValue];
NSString* uuid = [menuItemDictionary objectForKey:@"uuid"];
NSArray* childrenSubMenuItems = (NSArray*)[menuItemDictionary objectForKey:@"contextMenuItems"];
if (childrenSubMenuItems != nil && [childrenSubMenuItems count] != 0)
{
NSMenuItem* mainMenuItem = [menu insertItemWithTitle:mainMenuTitle action:nil keyEquivalent:@"" atIndex:menuIndex];
[self addChildrenSubMenuItems:mainMenuItem withChildren:childrenSubMenuItems forFiles:files];
}
else
{
[self createActionMenuItemIn:menu withTitle:mainMenuTitle withIndex:menuIndex enabled:enabled withUuid:uuid forFiles:files];
}
}
}
- (void)createActionMenuItemIn:(NSMenu*)menu withTitle:(NSString*)title withIndex:(NSInteger*)index enabled:(BOOL)enabled withUuid:(NSString*)uuid forFiles:(NSArray*)files
{
NSMenuItem* mainMenuItem = [menu insertItemWithTitle:title action:@selector(menuItemClicked:) keyEquivalent:@"" atIndex:index];
if (enabled)
{
[mainMenuItem setTarget:self];
}
NSDictionary* menuActionDictionary = [[NSMutableDictionary alloc] init];
[menuActionDictionary setValue:uuid forKey:@"uuid"];
NSMutableArray* filesArray = [files copy];
[menuActionDictionary setValue:filesArray forKey:@"files"];
[mainMenuItem setRepresentedObject:menuActionDictionary];
[filesArray release];
[menuActionDictionary release];
}
- (void)menuItemClicked:(id)param
{
[[OwnCloudFinderRequestManager sharedInstance] menuItemClicked:[param representedObject]];
}
- (NSArray*)pathsForNodes:(const struct TFENodeVector*)nodes
{
struct TFENode* start = nodes->_M_impl._M_start;
struct TFENode* end = nodes->_M_impl._M_finish;
int count = end - start;
NSMutableArray* selectedItems = [[NSMutableArray alloc] initWithCapacity:count];
struct TFENode* current;
for (current = start; current < end; ++current)
{
FINode* node = (FINode*)[NSClassFromString(@"FINode") nodeFromNodeRef:current->fNodeRef];
NSString* path = [[node previewItemURL] path];
if (path)
{
[selectedItems addObject:path];
}
}
return [selectedItems autorelease];
}
@end