mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-13 22:52:26 +00:00
implemented delegation from menu actions to plugins
This commit is contained in:
@@ -146,6 +146,7 @@
|
||||
4C6F228C19A4AA700012310C /* MPAutotypeDelay.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6F228B19A4AA700012310C /* MPAutotypeDelay.m */; };
|
||||
4C701CBC178618A000581B88 /* 12_RemoteTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C701CBB178618A000581B88 /* 12_RemoteTemplate.pdf */; };
|
||||
4C7155D81A10DB6D00979307 /* IconSelection.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C7155DA1A10DB6D00979307 /* IconSelection.xib */; };
|
||||
4C735FC02035FCBF00708D53 /* MPPluginEntryActionContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C735FBF2035FCBF00708D53 /* MPPluginEntryActionContext.m */; };
|
||||
4C76155C1764C04C0015A1A6 /* GeneralSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76155E1764C04C0015A1A6 /* GeneralSettings.xib */; };
|
||||
4C7615681764C0C40015A1A6 /* PasswordInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76156A1764C0C40015A1A6 /* PasswordInputView.xib */; };
|
||||
4C76156D1764C0E20015A1A6 /* InspectorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76156F1764C0E20015A1A6 /* InspectorView.xib */; };
|
||||
@@ -562,6 +563,8 @@
|
||||
4C7155E81A10DB7700979307 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/IconSelection.strings; sourceTree = "<group>"; };
|
||||
4C7155EA1A10DB7800979307 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/IconSelection.strings; sourceTree = "<group>"; };
|
||||
4C7155EC1A10DB7900979307 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/IconSelection.strings; sourceTree = "<group>"; };
|
||||
4C735FBE2035FCBF00708D53 /* MPPluginEntryActionContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPluginEntryActionContext.h; sourceTree = "<group>"; };
|
||||
4C735FBF2035FCBF00708D53 /* MPPluginEntryActionContext.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginEntryActionContext.m; sourceTree = "<group>"; };
|
||||
4C73EB941FBB58730033000F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/DatabaseSettingsWindow.strings; sourceTree = "<group>"; };
|
||||
4C73EB951FBB5A8F0033000F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/AutotypeCandidateSelectionView.strings; sourceTree = "<group>"; };
|
||||
4C73EB961FBB5A910033000F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
|
||||
@@ -1617,6 +1620,8 @@
|
||||
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */,
|
||||
4CA78BFE1FD58C92003C8560 /* MPPluginRepository.h */,
|
||||
4CA78BFF1FD58C92003C8560 /* MPPluginRepository.m */,
|
||||
4C735FBE2035FCBF00708D53 /* MPPluginEntryActionContext.h */,
|
||||
4C735FBF2035FCBF00708D53 /* MPPluginEntryActionContext.m */,
|
||||
);
|
||||
name = Plugin;
|
||||
path = MacPass;
|
||||
@@ -1896,6 +1901,7 @@
|
||||
4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */,
|
||||
4C7B63731C0CB51F00D7038C /* TTTDataTransformer.m in Sources */,
|
||||
4C8F0C711FCEF91400BE157F /* MPPickcharsParser.m in Sources */,
|
||||
4C735FC02035FCBF00708D53 /* MPPluginEntryActionContext.m in Sources */,
|
||||
4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */,
|
||||
4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */,
|
||||
4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */,
|
||||
|
||||
22
MacPass/MPPluginEntryActionContext.h
Normal file
22
MacPass/MPPluginEntryActionContext.h
Normal file
@@ -0,0 +1,22 @@
|
||||
//
|
||||
// MPPluginEntryActionContext.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 15.02.18.
|
||||
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class MPPlugin;
|
||||
@class KPKEntry;
|
||||
@protocol MPEntryActionPlugin;
|
||||
|
||||
@interface MPPluginEntryActionContext : NSObject
|
||||
|
||||
@property (strong) MPPlugin<MPEntryActionPlugin> *plugin;
|
||||
@property (copy) NSArray <KPKEntry *> *entries;
|
||||
|
||||
- (instancetype)initWithPlugin:(MPPlugin<MPEntryActionPlugin> *)plugin entries:(NSArray <KPKEntry *> *)entries NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
@end
|
||||
26
MacPass/MPPluginEntryActionContext.m
Normal file
26
MacPass/MPPluginEntryActionContext.m
Normal file
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// MPPluginEntryActionContext.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 15.02.18.
|
||||
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPluginEntryActionContext.h"
|
||||
|
||||
@implementation MPPluginEntryActionContext
|
||||
|
||||
- (instancetype)init {
|
||||
return [self initWithPlugin:nil entries:nil];
|
||||
}
|
||||
|
||||
- (instancetype)initWithPlugin:(MPPlugin<MPEntryActionPlugin> *)plugin entries:(NSArray<KPKEntry *> *)entries {
|
||||
self = [super init];
|
||||
if(self) {
|
||||
_plugin = plugin;
|
||||
_entries = [entries copy];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -25,6 +25,8 @@
|
||||
#import "MPPlugin.h"
|
||||
#import "MPPlugin_Private.h"
|
||||
#import "MPPluginConstants.h"
|
||||
#import "MPPluginEntryActionContext.h"
|
||||
|
||||
#import "NSApplication+MPAdditions.h"
|
||||
#import "MPSettingsHelper.h"
|
||||
|
||||
@@ -40,8 +42,8 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
||||
|
||||
@interface MPPluginHost ()
|
||||
@property (strong) NSMutableArray<MPPlugin __kindof *> *mutablePlugins;
|
||||
@property (strong) NSPointerArray *entryActionPlugins;
|
||||
@property (strong) NSPointerArray *customAttributePlugins;
|
||||
@property (strong) NSMutableArray<NSString *> *entryActionPluginIdentifiers;
|
||||
@property (strong) NSMutableArray<NSString *> *customAttributePluginIdentifiers;
|
||||
|
||||
|
||||
@property (nonatomic) BOOL loadUnsecurePlugins;
|
||||
@@ -74,8 +76,8 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
||||
_mutablePlugins = [[NSMutableArray alloc] init];
|
||||
_disabledPlugins = [[NSUserDefaults standardUserDefaults] arrayForKey:kMPSettingsKeyLoadUnsecurePlugins];
|
||||
_loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins];
|
||||
_entryActionPlugins = [NSPointerArray weakObjectsPointerArray];
|
||||
_customAttributePlugins = [NSPointerArray weakObjectsPointerArray];
|
||||
_entryActionPluginIdentifiers = [[NSMutableArray alloc] init];
|
||||
_customAttributePluginIdentifiers = [[NSMutableArray alloc] init];
|
||||
|
||||
[self _loadPlugins];
|
||||
|
||||
@@ -296,25 +298,52 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
||||
- (void)_addPlugin:(MPPlugin *)plugin {
|
||||
[self.mutablePlugins addObject:plugin];
|
||||
if([plugin conformsToProtocol:@protocol(MPEntryActionPlugin)]) {
|
||||
[self.entryActionPlugins addPointer:(__bridge void * _Nullable)(plugin)];
|
||||
NSAssert(![self.entryActionPluginIdentifiers containsObject:plugin.identifier], @"Internal inconsitency. Duplicate bundle identifier used %@!", plugin.identifier);
|
||||
[self.entryActionPluginIdentifiers addObject:plugin.identifier];
|
||||
}
|
||||
if([plugin conformsToProtocol:@protocol(MPCustomAttributePlugin)]) {
|
||||
[self.customAttributePlugins addPointer:(__bridge void * _Nullable)(plugin)];
|
||||
NSAssert(![self.customAttributePluginIdentifiers containsObject:plugin.identifier], @"Internal inconsitency. Duplicate bundle identifier used %@!", plugin.identifier);
|
||||
[self.customAttributePluginIdentifiers addObject:plugin.identifier];
|
||||
}
|
||||
}
|
||||
|
||||
- (MPPlugin *)_pluginWithIdentifier:(NSString *)bundleIdentifier {
|
||||
for(MPPlugin *plugin in self.mutablePlugins) {
|
||||
if([plugin.identifier isEqualToString:bundleIdentifier]) {
|
||||
return plugin;
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
#pragma mark Action Plugins
|
||||
|
||||
- (NSArray *)avilableMenuItemsForEntries:(NSArray<KPKEntry *> *)entries {
|
||||
NSMutableArray *items = [[NSMutableArray alloc] init];
|
||||
for(id<MPEntryActionPlugin> plugin in self.entryActionPlugins) {
|
||||
for(NSString *identifier in self.entryActionPluginIdentifiers) {
|
||||
MPPlugin<MPEntryActionPlugin> *plugin = (MPPlugin<MPEntryActionPlugin> *)[self _pluginWithIdentifier:identifier];
|
||||
if(plugin) {
|
||||
[items addObjectsFromArray:[plugin menuItemsForEntries:entries]];
|
||||
NSArray <NSMenuItem *> *tmpItems = [plugin menuItemsForEntries:entries];
|
||||
for(NSMenuItem *item in tmpItems) {
|
||||
item.representedObject = [[MPPluginEntryActionContext alloc] initWithPlugin:plugin entries:entries];
|
||||
item.target = self;
|
||||
item.action = @selector(_performEntryAction:);
|
||||
}
|
||||
[items addObjectsFromArray:tmpItems];
|
||||
}
|
||||
}
|
||||
return [items copy];
|
||||
}
|
||||
|
||||
- (void)_performEntryAction:(id)sender {
|
||||
if(![sender isKindOfClass:NSMenuItem.class]) {
|
||||
return;
|
||||
}
|
||||
NSMenuItem *item = sender;
|
||||
MPPluginEntryActionContext *context = item.representedObject;
|
||||
[context.plugin performActionForMenuItem:item withEntries:context.entries];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
|
||||
Reference in New Issue
Block a user