mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-13 21:42:32 +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 */; };
|
4C6F228C19A4AA700012310C /* MPAutotypeDelay.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6F228B19A4AA700012310C /* MPAutotypeDelay.m */; };
|
||||||
4C701CBC178618A000581B88 /* 12_RemoteTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C701CBB178618A000581B88 /* 12_RemoteTemplate.pdf */; };
|
4C701CBC178618A000581B88 /* 12_RemoteTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C701CBB178618A000581B88 /* 12_RemoteTemplate.pdf */; };
|
||||||
4C7155D81A10DB6D00979307 /* IconSelection.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C7155DA1A10DB6D00979307 /* IconSelection.xib */; };
|
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 */; };
|
4C76155C1764C04C0015A1A6 /* GeneralSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76155E1764C04C0015A1A6 /* GeneralSettings.xib */; };
|
||||||
4C7615681764C0C40015A1A6 /* PasswordInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76156A1764C0C40015A1A6 /* PasswordInputView.xib */; };
|
4C7615681764C0C40015A1A6 /* PasswordInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76156A1764C0C40015A1A6 /* PasswordInputView.xib */; };
|
||||||
4C76156D1764C0E20015A1A6 /* InspectorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76156F1764C0E20015A1A6 /* InspectorView.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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
4C73EB961FBB5A910033000F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
|
||||||
@@ -1617,6 +1620,8 @@
|
|||||||
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */,
|
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */,
|
||||||
4CA78BFE1FD58C92003C8560 /* MPPluginRepository.h */,
|
4CA78BFE1FD58C92003C8560 /* MPPluginRepository.h */,
|
||||||
4CA78BFF1FD58C92003C8560 /* MPPluginRepository.m */,
|
4CA78BFF1FD58C92003C8560 /* MPPluginRepository.m */,
|
||||||
|
4C735FBE2035FCBF00708D53 /* MPPluginEntryActionContext.h */,
|
||||||
|
4C735FBF2035FCBF00708D53 /* MPPluginEntryActionContext.m */,
|
||||||
);
|
);
|
||||||
name = Plugin;
|
name = Plugin;
|
||||||
path = MacPass;
|
path = MacPass;
|
||||||
@@ -1896,6 +1901,7 @@
|
|||||||
4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */,
|
4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */,
|
||||||
4C7B63731C0CB51F00D7038C /* TTTDataTransformer.m in Sources */,
|
4C7B63731C0CB51F00D7038C /* TTTDataTransformer.m in Sources */,
|
||||||
4C8F0C711FCEF91400BE157F /* MPPickcharsParser.m in Sources */,
|
4C8F0C711FCEF91400BE157F /* MPPickcharsParser.m in Sources */,
|
||||||
|
4C735FC02035FCBF00708D53 /* MPPluginEntryActionContext.m in Sources */,
|
||||||
4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */,
|
4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */,
|
||||||
4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */,
|
4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */,
|
||||||
4C431BCD16E2A82800700A81 /* MPPasteBoardController.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.h"
|
||||||
#import "MPPlugin_Private.h"
|
#import "MPPlugin_Private.h"
|
||||||
#import "MPPluginConstants.h"
|
#import "MPPluginConstants.h"
|
||||||
|
#import "MPPluginEntryActionContext.h"
|
||||||
|
|
||||||
#import "NSApplication+MPAdditions.h"
|
#import "NSApplication+MPAdditions.h"
|
||||||
#import "MPSettingsHelper.h"
|
#import "MPSettingsHelper.h"
|
||||||
|
|
||||||
@@ -40,8 +42,8 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
|||||||
|
|
||||||
@interface MPPluginHost ()
|
@interface MPPluginHost ()
|
||||||
@property (strong) NSMutableArray<MPPlugin __kindof *> *mutablePlugins;
|
@property (strong) NSMutableArray<MPPlugin __kindof *> *mutablePlugins;
|
||||||
@property (strong) NSPointerArray *entryActionPlugins;
|
@property (strong) NSMutableArray<NSString *> *entryActionPluginIdentifiers;
|
||||||
@property (strong) NSPointerArray *customAttributePlugins;
|
@property (strong) NSMutableArray<NSString *> *customAttributePluginIdentifiers;
|
||||||
|
|
||||||
|
|
||||||
@property (nonatomic) BOOL loadUnsecurePlugins;
|
@property (nonatomic) BOOL loadUnsecurePlugins;
|
||||||
@@ -74,8 +76,8 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
|||||||
_mutablePlugins = [[NSMutableArray alloc] init];
|
_mutablePlugins = [[NSMutableArray alloc] init];
|
||||||
_disabledPlugins = [[NSUserDefaults standardUserDefaults] arrayForKey:kMPSettingsKeyLoadUnsecurePlugins];
|
_disabledPlugins = [[NSUserDefaults standardUserDefaults] arrayForKey:kMPSettingsKeyLoadUnsecurePlugins];
|
||||||
_loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins];
|
_loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins];
|
||||||
_entryActionPlugins = [NSPointerArray weakObjectsPointerArray];
|
_entryActionPluginIdentifiers = [[NSMutableArray alloc] init];
|
||||||
_customAttributePlugins = [NSPointerArray weakObjectsPointerArray];
|
_customAttributePluginIdentifiers = [[NSMutableArray alloc] init];
|
||||||
|
|
||||||
[self _loadPlugins];
|
[self _loadPlugins];
|
||||||
|
|
||||||
@@ -296,25 +298,52 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
|||||||
- (void)_addPlugin:(MPPlugin *)plugin {
|
- (void)_addPlugin:(MPPlugin *)plugin {
|
||||||
[self.mutablePlugins addObject:plugin];
|
[self.mutablePlugins addObject:plugin];
|
||||||
if([plugin conformsToProtocol:@protocol(MPEntryActionPlugin)]) {
|
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)]) {
|
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
|
#pragma mark Action Plugins
|
||||||
|
|
||||||
- (NSArray *)avilableMenuItemsForEntries:(NSArray<KPKEntry *> *)entries {
|
- (NSArray *)avilableMenuItemsForEntries:(NSArray<KPKEntry *> *)entries {
|
||||||
NSMutableArray *items = [[NSMutableArray alloc] init];
|
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) {
|
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];
|
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
|
@end
|
||||||
|
|||||||
Reference in New Issue
Block a user