Revision: 29755
          http://sourceforge.net/p/bibdesk/svn/29755
Author:   hofman
Date:     2025-10-22 16:46:47 +0000 (Wed, 22 Oct 2025)
Log Message:
-----------
Update main submenus depending on templates only after templates have changed. 
Also update for key equivalents if needed.

Modified Paths:
--------------
    trunk/bibdesk/BDSKAppController.h
    trunk/bibdesk/BDSKAppController.m

Modified: trunk/bibdesk/BDSKAppController.h
===================================================================
--- trunk/bibdesk/BDSKAppController.h   2025-10-22 16:25:57 UTC (rev 29754)
+++ trunk/bibdesk/BDSKAppController.h   2025-10-22 16:46:47 UTC (rev 29755)
@@ -47,6 +47,9 @@
     NSMenu *sidePreviewDisplayMenu;
     NSMenu *historyMenu;
     NSMenu *shareMenu;
+    BOOL templatedCopyMenuNeeedsUpdate;
+    BOOL previewDisplayMenuNeeedsUpdate;
+    BOOL sidePreviewDisplayMenuNeeedsUpdate;
 }
 
 @property (nonatomic, nullable, strong) IBOutlet NSMenu *columnsMenu;

Modified: trunk/bibdesk/BDSKAppController.m
===================================================================
--- trunk/bibdesk/BDSKAppController.m   2025-10-22 16:25:57 UTC (rev 29754)
+++ trunk/bibdesk/BDSKAppController.m   2025-10-22 16:46:47 UTC (rev 29755)
@@ -105,6 +105,10 @@
     BDSKOpenLastOpenFiles
 };
 
+@interface BDSKAppController ()
+- (void)handleTemplatesChanged:(NSNotification *)notification;
+@end
+
 @implementation BDSKAppController
 
 @synthesize columnsMenu, groupSortMenu, groupFieldMenu, templatedCopyMenu, 
previewDisplayMenu, sidePreviewDisplayMenu, historyMenu, shareMenu;
@@ -129,6 +133,17 @@
         [sud setObject:fixedTableColumnIdentifiers 
forKey:BDSKShownColsNamesKey];
 }
 
+- (id)init {
+    self = [super init];
+    if (self) {
+        templatedCopyMenuNeeedsUpdate = YES;
+        previewDisplayMenuNeeedsUpdate = YES;
+        sidePreviewDisplayMenuNeeedsUpdate = YES;
+        [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(handleTemplatesChanged:) 
name:BDSKExportTemplatesChangedNotification object:nil];
+    }
+    return self;
+}
+
 - (void)awakeFromNib{   
     // Add a Scripts menu; searches in (mainbundle)/Contents/Scripts and 
(Library domains)/Application Support/BibDesk/Scripts
     [NSApp scriptMenu];
@@ -519,6 +534,12 @@
 
 #pragma mark Menu stuff
 
+- (void)handleTemplatesChanged:(NSNotification *)notification {
+    templatedCopyMenuNeeedsUpdate = YES;
+    previewDisplayMenuNeeedsUpdate = YES;
+    sidePreviewDisplayMenuNeeedsUpdate = YES;
+}
+
 - (BOOL) validateMenuItem:(NSMenuItem*)menuItem{
        SEL act = [menuItem action];
 
@@ -573,7 +594,13 @@
 }
 
 // implemented in order to prevent the Copy As > Template menu from being 
updated at every key event
-- (BOOL)menuHasKeyEquivalent:(NSMenu *)menu forEvent:(NSEvent *)event 
target:(id *)target action:(SEL *)action { return NO; }
+- (BOOL)menuHasKeyEquivalent:(NSMenu *)menu forEvent:(NSEvent *)event 
target:(id *)target action:(SEL *)action {
+    if ((menu == templatedCopyMenu && templatedCopyMenuNeeedsUpdate) ||
+        (menu == previewDisplayMenu && previewDisplayMenuNeeedsUpdate) ||
+        (menu == sidePreviewDisplayMenu && sidePreviewDisplayMenuNeeedsUpdate))
+        [self menuNeedsUpdate:menu];
+    return NO;
+}
 
 - (void)addMenuItemsForHistoryItems:(NSArray *)historyItems toMenu:(NSMenu 
*)menu {
     for (WebHistoryItem *historyItem in historyItems) {
@@ -591,7 +618,7 @@
 - (void)menuNeedsUpdate:(NSMenu *)menu {
     
     if ([menu isEqual:columnsMenu]) {
-                
+        
         // remove all items; then fill it with the items from the current 
document
         [menu removeAllItems];
         
@@ -624,34 +651,62 @@
         }
         
     } else if ([menu isEqual:templatedCopyMenu]) {
-    
-        NSArray *styles = [BDSKTemplate allStyleNames];
-        NSInteger i = [menu numberOfItems];
-        while (i--) {
-            if ([[menu itemAtIndex:i] tag] < BDSKDragCopyTemplate)
-                break;
-            [menu removeItemAtIndex:i];
+        
+        if (templatedCopyMenuNeeedsUpdate) {
+            NSArray *styles = [BDSKTemplate allStyleNames];
+            NSInteger i = [menu numberOfItems];
+            while (i--) {
+                if ([[menu itemAtIndex:i] tag] < BDSKDragCopyTemplate)
+                    break;
+                [menu removeItemAtIndex:i];
+            }
+            
+            [styles enumerateObjectsUsingBlock:^(NSString *style, NSUInteger 
idx, BOOL *stop){
+                NSMenuItem *item = [menu addItemWithTitle:style 
action:@selector(copyAsAction:) keyEquivalent:@""];
+                [item setTag:BDSKDragCopyTemplate + idx];
+            }];
+            
+            templatedCopyMenuNeeedsUpdate = NO;
         }
         
-        [styles enumerateObjectsUsingBlock:^(NSString *style, NSUInteger idx, 
BOOL *stop){
-            NSMenuItem *item = [menu addItemWithTitle:style 
action:@selector(copyAsAction:) keyEquivalent:@""];
-            [item setTag:BDSKDragCopyTemplate + idx];
-        }];
+    } else if ([menu isEqual:previewDisplayMenu]) {
         
-    } else if ([menu isEqual:previewDisplayMenu] || [menu 
isEqual:sidePreviewDisplayMenu]) {
-    
-        NSArray *styles = [BDSKTemplate 
allStyleNamesForFormat:(BDSKTemplateFormatRichText | 
BDSKTemplateFormatPlainHTML)];
+        if (previewDisplayMenuNeeedsUpdate) {
+            NSArray *styles = [BDSKTemplate 
allStyleNamesForFormat:(BDSKTemplateFormatRichText | 
BDSKTemplateFormatPlainHTML)];
+            
+            NSInteger i = [menu numberOfItems];
+            while (i-- && [[menu itemAtIndex:i] isSeparatorItem] == NO)
+                [menu removeItemAtIndex:i];
+            
+            NSMenuItem *item;
+            SEL action = @selector(changePreviewDisplay:);
+            for (NSString *style in styles) {
+                item = [menu addItemWithTitle:style action:action 
keyEquivalent:@""];
+                [item setTag:BDSKPreviewDisplayText];
+                [item setRepresentedObject:style];
+            }
+            
+            previewDisplayMenuNeeedsUpdate = NO;
+        }
         
-        NSInteger i = [menu numberOfItems];
-        while (i-- && [[menu itemAtIndex:i] isSeparatorItem] == NO)
-            [menu removeItemAtIndex:i];
+    } else if ([menu isEqual:sidePreviewDisplayMenu]) {
         
-        NSMenuItem *item;
-        SEL action = [menu isEqual:previewDisplayMenu] ? 
@selector(changePreviewDisplay:) : @selector(changeSidePreviewDisplay:);
-        for (NSString *style in styles) {
-            item = [menu addItemWithTitle:style action:action 
keyEquivalent:@""];
-            [item setTag:BDSKPreviewDisplayText];
-            [item setRepresentedObject:style];
+        if (sidePreviewDisplayMenuNeeedsUpdate) {
+            NSArray *styles = [BDSKTemplate 
allStyleNamesForFormat:(BDSKTemplateFormatRichText | 
BDSKTemplateFormatPlainHTML)];
+            
+            NSInteger i = [menu numberOfItems];
+            while (i-- && [[menu itemAtIndex:i] isSeparatorItem] == NO)
+                [menu removeItemAtIndex:i];
+            
+            NSMenuItem *item;
+            SEL action = @selector(changeSidePreviewDisplay:);
+            for (NSString *style in styles) {
+                item = [menu addItemWithTitle:style action:action 
keyEquivalent:@""];
+                [item setTag:BDSKPreviewDisplayText];
+                [item setRepresentedObject:style];
+            }
+            
+            sidePreviewDisplayMenuNeeedsUpdate = NO;
         }
         
     } else if ([menu isEqual:historyMenu]) {

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to