/Classes/WCProjectMenuController.m

http://wabbitcode.googlecode.com/ · Objective C · 110 lines · 91 code · 12 blank · 7 comment · 16 complexity · b90d56adf4a3401e49017ac1e2a973af MD5 · raw file

  1. //
  2. // WCProjectMenuController.m
  3. // WabbitCode
  4. //
  5. // Created by William Towe on 1/29/09.
  6. // Copyright 2009 Revolution Software. All rights reserved.
  7. //
  8. #import "WCProjectMenuController.h"
  9. #import "WCProject.h"
  10. #import "WCDocumentController.h"
  11. #import "WCBuildTarget.h"
  12. #import "WCBuildConfiguration.h"
  13. #import "WCBuildTargetsGroup.h"
  14. #import "WCMacros.h"
  15. #import "NSMenu+WCExtensions.h"
  16. static const NSInteger kSetActiveBuildTargetMenuItemTag = 100;
  17. static const NSInteger kSetActiveBuildConfigurationMenuItemTag = 101;
  18. @implementation WCProjectMenuController
  19. - (BOOL)validateMenuItem:(NSMenuItem *)item {
  20. SEL action = [item action];
  21. if (action == @selector(editActiveTargetAction:)) {
  22. WCProject *project = [[WCDocumentController sharedDocumentController] currentProject];
  23. if (!project) {
  24. [item setTitle:NSLocalizedString(@"Edit Active Target",@"Edit Active Target")];
  25. return NO;
  26. }
  27. WCBuildTarget *target = [project activeBuildTarget];
  28. [item setTitle:[NSString stringWithFormat:NSLocalizedString(@"Edit Active Target \"%@\"",@"Edit Active Target \"%@\""), [target name]]];
  29. }
  30. else if (action == @selector(editActiveConfigurationAction:)) {
  31. WCProject *project = [[WCDocumentController sharedDocumentController] currentProject];
  32. if (!project) {
  33. [item setTitle:NSLocalizedString(@"Edit Active Configuration",@"Edit Active Configuration")];
  34. return NO;
  35. }
  36. WCBuildConfiguration *config = [project activeBuildConfiguration];
  37. [item setTitle:[NSString stringWithFormat:NSLocalizedString(@"Edit Active Configuration \"%@\"",@"Edit Active Configuration \"%@\""), [config name]]];
  38. }
  39. return YES;
  40. }
  41. #pragma mark NSMenu Delegate
  42. - (void)menuNeedsUpdate:(NSMenu *)menu {
  43. [menu removeAllItems];
  44. WCProject *project = [[WCDocumentController sharedDocumentController] currentProject];
  45. if (!project) {
  46. [menu addItemWithTitle:NSLocalizedString(@"No Project",@"No Project") action:NULL keyEquivalent:@""];
  47. return;
  48. }
  49. NSUInteger index = 0;
  50. if ([[[[menu supermenu] itemWithTag:kSetActiveBuildTargetMenuItemTag] submenu] isEqualTo:menu]) {
  51. WCBuildTarget *activeTarget = [project activeBuildTarget];
  52. for (WCBuildTarget *target in [[project buildTargetsGroup] childNodes]) {
  53. NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:[target name] action:@selector(_setActiveBuildTargetAction:) keyEquivalent:@""] autorelease];
  54. [item setImage:[target icon]];
  55. [item setTag:index++];
  56. [item setState:(activeTarget == target)?NSOnState:NSOffState];
  57. [item setTarget:self];
  58. [menu addItem:item];
  59. }
  60. }
  61. else if ([[[[menu supermenu] itemWithTag:kSetActiveBuildConfigurationMenuItemTag] submenu] isEqualTo:menu]) {
  62. WCBuildConfiguration *activeConfig = [project activeBuildConfiguration];
  63. for (WCBuildConfiguration *config in [[project activeBuildTarget] buildConfigurations]) {
  64. NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:[config name] action:@selector(_setActiveBuildConfigurationAction:) keyEquivalent:@""] autorelease];
  65. [item setImage:[config icon]];
  66. [item setTag:index++];
  67. [item setState:(activeConfig == config)?NSOnState:NSOffState];
  68. [item setTarget:self];
  69. [menu addItem:item];
  70. }
  71. }
  72. }
  73. #pragma mark *** Public Methods ***
  74. + (WCProjectMenuController *)sharedInstance; {
  75. static id sharedInstance = nil;
  76. if (!sharedInstance)
  77. sharedInstance = [[[self class] alloc] init];
  78. return sharedInstance;
  79. }
  80. #pragma mark IBActions
  81. - (IBAction)editActiveTargetAction:(id)sender; {
  82. WCProject *project = [[WCDocumentController sharedDocumentController] currentProject];
  83. [project showGetInfoWindowForItem:[project activeBuildTarget]];
  84. }
  85. - (IBAction)editActiveConfigurationAction:(id)sender; {
  86. WCProject *project = [[WCDocumentController sharedDocumentController] currentProject];
  87. [project showGetInfoWindowForItem:[project activeBuildConfiguration]];
  88. }
  89. #pragma mark *** Private Methods ***
  90. - (IBAction)_setActiveBuildTargetAction:(id)sender {
  91. WCProject *project = [[WCDocumentController sharedDocumentController] currentProject];
  92. [project setActiveBuildTarget:[[[project buildTargetsGroup] childNodes] objectAtIndex:[sender tag]]];
  93. }
  94. - (IBAction)_setActiveBuildConfigurationAction:(id)sender {
  95. WCProject *project = [[WCDocumentController sharedDocumentController] currentProject];
  96. [project setActiveBuildConfiguration:[[[project activeBuildTarget] buildConfigurations] objectAtIndex:[sender tag]]];
  97. }
  98. @end