1 /* vi:set ts=8 sts=4 sw=4 ft=objc:
3 * VIM - Vi IMproved by Bram Moolenaar
4 * MacVim GUI port by Bjorn Winckler
6 * Do ":help uganda" in Vim to read copying and usage conditions.
7 * Do ":help credits" in Vim to see a list of people who contributed.
8 * See README.txt for an overview of the Vim source code.
12 * MMPlugInInstanceMediator
14 * Implementation of the PlugInInstanceMediator protocol. One of these is
15 * created per vim instance. It manages all of the plugin instances for that
20 * Implementation of the PlugInAppMediator protocol. Singleton class.
25 #import "Miscellaneous.h"
27 #ifdef MM_ENABLE_PLUGINS
29 static int MMPlugInArchMajorVersion = 1;
30 static int MMPlugInArchMinorVersion = 0;
32 #import "PlugInImpl.h"
34 #import "MMPlugInManager.h"
35 #import "RBSplitView.h"
36 #import "MMAppController.h"
37 #import "MMVimController.h"
40 @implementation MMPlugInInstanceMediator
44 // XXX The drawer does not work in full screen mode. Eventually, the
45 // drawer will go away so I'm ignoring this issue for now.
46 drawer = [[NSDrawer alloc] initWithContentSize:NSMakeSize(200,100)
47 preferredEdge:NSMinXEdge];
50 NSSize contentSize = [drawer contentSize];
52 // XXX memory management for this
53 MMPlugInViewContainer *containerView = [[MMPlugInViewContainer alloc]
54 initWithFrame:NSMakeRect(0, 0, contentSize.width, contentSize.height)];
56 [drawer setContentView:containerView];
58 [containerView release];
60 [drawer setParentWindow:[[vimController windowController] window]];
66 [[NSUserDefaults standardUserDefaults]
67 setBool:[drawer state] == NSDrawerOpenState
68 || [drawer state] == NSDrawerOpeningState
69 forKey:MMShowLeftPlugInContainerKey];
72 - (void)initializeInstances
74 NSArray *plugInClasses = [[MMPlugInManager sharedManager] plugInClasses];
75 int i, count = [plugInClasses count];
76 for (i = 0; i < count; i++) {
77 Class plugInClass = [plugInClasses objectAtIndex:i];
78 if ([plugInClass instancesRespondToSelector:
79 @selector(initWithMediator:)]) {
80 id instance = [[[plugInClass alloc] initWithMediator:self] autorelease];
81 [instances addObject:instance];
86 - (id)initWithVimController:(MMVimController *)controller
88 if ((self = [super init]) == nil) return nil;
89 vimController = controller;
90 instances = [[NSMutableArray alloc] init];
91 plugInViews = [[NSMutableArray alloc] init];
94 [self initializeInstances];
103 [plugInViews release]; plugInViews = nil;
104 [instances release]; instances = nil;
105 [drawer release]; drawer = nil;
111 - (id)evaluateVimExpression:(NSString *)vimExpression
113 NSString *errstr = nil;
114 id res = [vimController evaluateVimExpressionCocoa:vimExpression
115 errorString:&errstr];
117 [NSException raise:@"VimEvaluationException" format:errstr];
122 - (void)addVimInput:(NSString *)input
124 [vimController addVimInput:input];
127 - (void)addPlugInView:(NSView *)view withTitle:(NSString *)title
129 // Do this here so that the drawer is never opened automatically when there
130 // are no plugin views.
131 if ([[NSUserDefaults standardUserDefaults]
132 boolForKey:MMShowLeftPlugInContainerKey] && [plugInViews count] == 0)
135 MMPlugInViewController *newView =
136 [[MMPlugInViewController alloc] initWithView:view title:title];
138 [plugInViews addObject:newView];
140 [newView moveToContainer:(MMPlugInViewContainer *)[drawer contentView]];
145 - (void)openFiles:(NSArray *)filenames
147 [vimController dropFiles:filenames forceOpen:YES];
150 - (id)instanceWithClass:(Class)class
152 int i, count = [instances count];
153 for (i = 0; i < count; i++) {
154 id instance = [instances objectAtIndex:i];
155 if ([instance isKindOfClass:class])
164 @implementation MMPlugInAppMediator
166 MMPlugInAppMediator *sharedAppMediator = nil;
168 + (MMPlugInAppMediator *)sharedAppMediator
170 if (sharedAppMediator == nil)
171 sharedAppMediator = [[MMPlugInAppMediator alloc] init];
173 return sharedAppMediator;
178 if ((self = [super init]) == nil) return nil;
180 NSString *title = NSLocalizedString(@"Toggle Left Drawer",
181 @"Toggle Left Drawer menu title");
182 NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:title
183 action:@selector(toggleLeftDrawer:)
184 keyEquivalent:@""] autorelease];
185 [item setTarget:self];
186 [self addPlugInMenuItem:item];
187 [self addPlugInMenuItem:[NSMenuItem separatorItem]];
192 - (void)toggleLeftDrawer:(id)sender
194 MMVimController *c = [[MMAppController sharedInstance] keyVimController];
196 [[c instanceMediator] toggleDrawer];
199 - (BOOL)validateMenuItem:(NSMenuItem *)item
201 return [[MMAppController sharedInstance] keyVimController] != nil;
204 - (void)addPlugInMenuItem:(NSMenuItem *)menuItem
206 NSAssert(menuItem, @"menuItem cannot be nil");
207 [[MMAppController sharedInstance] addItemToPlugInMenu:menuItem];
210 // It is a little bit ugly having to pass the class in here. An alternative
211 // would be to have a 1:1 relationship between app mediators and plugins, so
212 // that we'd know exactly which plugin class to look for.
213 - (id)keyPlugInInstanceWithClass:(Class)class
215 MMVimController *keyVimController = [[NSApp delegate] keyVimController];
217 if (keyVimController)
218 return [[keyVimController instanceMediator] instanceWithClass:class];
225 return MMPlugInArchMajorVersion;
230 return MMPlugInArchMinorVersion;