MenuItemProxy.m 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // MenuItemProxy.m
  3. // MacGap
  4. //
  5. // Created by Joe Hildebrand on 1/15/12.
  6. // Copyright (c) 2012 Twitter. All rights reserved.
  7. //
  8. #import "MenuItemProxy.h"
  9. #import "MenuProxy.h"
  10. @implementation MenuItemProxy
  11. - (id) initWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem
  12. {
  13. NSAssert(anItem, @"anItem required");
  14. self = [super initWithContext:aContext];
  15. if (!self)
  16. return nil;
  17. item = anItem;
  18. item.representedObject = self;
  19. return self;
  20. }
  21. + (MenuItemProxy*) proxyWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem
  22. {
  23. MenuItemProxy *proxy = [anItem representedObject];
  24. if (proxy)
  25. {
  26. NSLog(@"MIP Cache hit");
  27. NSAssert([proxy class] == [MenuItemProxy class], @"Bad proxy");
  28. return proxy;
  29. }
  30. return [[MenuItemProxy alloc] initWithContext:aContext andMenuItem:anItem];
  31. }
  32. - (NSString*) description
  33. {
  34. return [item description];
  35. }
  36. - (MenuProxy*)addSubmenu
  37. {
  38. NSMenu *s = [item submenu];
  39. if (!s)
  40. {
  41. s = [[NSMenu alloc] initWithTitle:@"FFFFFFOOOOO"];
  42. [item setSubmenu:s];
  43. }
  44. return [MenuProxy proxyWithContext:context andMenu:s];
  45. }
  46. - (void) remove
  47. {
  48. NSMenu *menu = [item menu];
  49. [menu removeItem:item];
  50. }
  51. - (void)callCallback:(id)sender
  52. {
  53. [callback callWithParams:[sender title], nil];
  54. }
  55. - (void) setCallback:(WebScriptObject*)aCallback
  56. {
  57. NSAssert(item, @"item required");
  58. callback = [[CallbackDelegate alloc] initWithContext:context forCallback:aCallback];
  59. [item setAction:@selector(callCallback:)];
  60. [item setTarget:self];
  61. }
  62. - (void)setKey:(NSString*)keyCommand
  63. {
  64. NSString *aKey = [MenuProxy getKeyFromString:keyCommand];
  65. [item setKeyEquivalent:aKey];
  66. NSUInteger modifiers = [MenuProxy getModifiersFromString:keyCommand];
  67. [item setKeyEquivalentModifierMask:modifiers];
  68. }
  69. - (void) setTitle:(NSString*)title
  70. {
  71. [item setTitle:title];
  72. }
  73. - (MenuProxy*)submenu;
  74. {
  75. // TODO: make this work as a property
  76. NSMenu *s = [item submenu];
  77. if (!s)
  78. return nil;
  79. return [MenuProxy proxyWithContext:context andMenu:s];
  80. }
  81. - (void) enable
  82. {
  83. [item setEnabled:YES];
  84. }
  85. - (void) disable
  86. {
  87. [item setEnabled:NO];
  88. }
  89. #pragma mark WebScripting protocol
  90. + (BOOL) isSelectorExcludedFromWebScript:(SEL)selector
  91. {
  92. return [self webScriptNameForSelector:selector] == nil;
  93. }
  94. + (BOOL) isKeyExcludedFromWebScript:(const char*)name
  95. {
  96. return YES;
  97. }
  98. + (NSString*) webScriptNameForSelector:(SEL)selector
  99. {
  100. id result = nil;
  101. if (selector == @selector(addSubmenu)) {
  102. result = @"addSubmenu";
  103. }
  104. else if (selector == @selector(remove)) {
  105. result = @"remove";
  106. }
  107. else if (selector == @selector(setCallback:)) {
  108. result = @"setCallback";
  109. }
  110. else if (selector == @selector(setKey:)) {
  111. result = @"setKey";
  112. }
  113. else if (selector == @selector(setTitle:)) {
  114. result = @"setTitle";
  115. }
  116. else if (selector == @selector(submenu)) {
  117. result = @"submenu";
  118. }
  119. else if (selector == @selector(enable)) {
  120. result = @"enable";
  121. }
  122. else if (selector == @selector(disable)) {
  123. result = @"disable";
  124. }
  125. return result;
  126. }
  127. @end