Revision: 27155
          http://sourceforge.net/p/bibdesk/svn/27155
Author:   hofman
Date:     2021-11-25 15:09:06 +0000 (Thu, 25 Nov 2021)
Log Message:
-----------
Validate edited row before getting and setting value. Commit or abort edits 
before reloading a table.

Modified Paths:
--------------
    trunk/bibdesk/BDSKTypeInfoEditor.m
    trunk/bibdesk/BDSKTypeManager.m

Modified: trunk/bibdesk/BDSKTypeInfoEditor.m
===================================================================
--- trunk/bibdesk/BDSKTypeInfoEditor.m  2021-11-25 07:30:37 UTC (rev 27154)
+++ trunk/bibdesk/BDSKTypeInfoEditor.m  2021-11-25 15:09:06 UTC (rev 27155)
@@ -97,23 +97,39 @@
        [self updateButtons];
 }
 
+- (void)commitWhenEditingTableView:(NSTableView *)tableView {
+    NSWindow *window = [self window];
+    id firstResponder = [window firstResponder];
+    if ([firstResponder isKindOfClass:[NSTextView class]] && -1 != [tableView 
rowForView:firstResponder])
+        [window makeFirstResponder:nil];
+}
+
+- (void)abortEditing {
+    NSWindow *window = [self window];
+    id firstResponder = [window firstResponder];
+    if ([firstResponder isKindOfClass:[NSTextView class]] && [[firstResponder 
delegate] isKindOfClass:[NSTextField class]])
+        [(NSTextField *)[firstResponder delegate] abortEditing];
+}
+
 - (void)revertTypes {
-       BDSKTypeManager *btm = [BDSKTypeManager sharedManager];
-       NSMutableDictionary *fieldsDict = [NSMutableDictionary 
dictionaryWithCapacity:2];
-       
-       [types removeAllObjects];
-       [fieldsForTypesDict removeAllObjects];
-       for (NSString *type in [btm types]) {
-               [fieldsDict setObject:[btm requiredFieldsForType:type] 
forKey:REQUIRED_KEY];
-               [fieldsDict setObject:[btm optionalFieldsForType:type] 
forKey:OPTIONAL_KEY];
-               [self addType:type withFields:fieldsDict];
-       }
-       [types sortUsingSelector:@selector(compare:)];
-       
-       [typeTableView reloadData];
-       [self setCurrentType:nil];
-       
-       [self setDocumentEdited:NO];
+    BDSKTypeManager *btm = [BDSKTypeManager sharedManager];
+    NSMutableDictionary *fieldsDict = [NSMutableDictionary 
dictionaryWithCapacity:2];
+    
+    [self abortEditing];
+    
+    [types removeAllObjects];
+    [fieldsForTypesDict removeAllObjects];
+    for (NSString *type in [btm types]) {
+        [fieldsDict setObject:[btm requiredFieldsForType:type] 
forKey:REQUIRED_KEY];
+        [fieldsDict setObject:[btm optionalFieldsForType:type] 
forKey:OPTIONAL_KEY];
+        [self addType:type withFields:fieldsDict];
+    }
+    [types sortUsingSelector:@selector(compare:)];
+    
+    [typeTableView reloadData];
+    [self setCurrentType:nil];
+    
+    [self setDocumentEdited:NO];
 }
 
 # pragma mark Accessors
@@ -142,6 +158,10 @@
 
 - (void)setCurrentType:(NSString *)newCurrentType {
     if (currentType == nil || ![currentType isEqualToString:newCurrentType]) {
+        
+        [self commitWhenEditingTableView:requiredTableView];
+        [self commitWhenEditingTableView:optionalTableView];
+        
         [currentType release];
         currentType = [newCurrentType copy];
                
@@ -181,6 +201,7 @@
 }
 
 - (IBAction)addRemoveType:(id)sender {
+    [self commitWhenEditingTableView:typeTableView];
     if ([sender selectedSegment] == 0) { // add
         
         NSString *newType = @"new-type";
@@ -216,6 +237,7 @@
 }
 
 - (IBAction)addRemoveRequired:(id)sender {
+    [self commitWhenEditingTableView:requiredTableView];
     if ([sender selectedSegment] == 0) { // add
         
         NSString *newField = @"New-Field";
@@ -249,6 +271,7 @@
 }
 
 - (IBAction)addRemoveOptional:(id)sender {
+    [self commitWhenEditingTableView:optionalTableView];
     if ([sender selectedSegment] == 0) { // add
         
         NSString *newField = @"New-Field";
@@ -286,7 +309,7 @@
                return;
        
        // make sure we stop editing
-       [[self window] makeFirstResponder:nil];
+       [self abortEditing];
        
        [currentRequiredFields removeAllObjects];
        [currentRequiredFields 
addObjectsFromArray:currentDefaultRequiredFields];
@@ -368,31 +391,35 @@
 
 - (IBAction)changeRequiredField:(id)sender {
     NSInteger row = [requiredTableView rowForView:sender];
-    // NSDictionary copies its keys, so types may be the only thing retaining 
oldValue (see bug #1596532)
-    NSString *oldValue = [currentRequiredFields objectAtIndex:row];
-    NSString *newValue = [[sender stringValue] fieldName];
-    if (NO == [newValue isEqualToString:oldValue] &&
-        NO == [currentRequiredFields containsObject:newValue] &&
-        NO == [currentOptionalFields containsObject:newValue]) {
-        
-        [currentRequiredFields replaceObjectAtIndex:row withObject:newValue];
-        
-        [self setDocumentEdited:YES];
+    if (row >= 0) {
+        // NSDictionary copies its keys, so types may be the only thing 
retaining oldValue (see bug #1596532)
+        NSString *oldValue = [currentRequiredFields objectAtIndex:row];
+        NSString *newValue = [[sender stringValue] fieldName];
+        if (NO == [newValue isEqualToString:oldValue] &&
+            NO == [currentRequiredFields containsObject:newValue] &&
+            NO == [currentOptionalFields containsObject:newValue]) {
+            
+            [currentRequiredFields replaceObjectAtIndex:row 
withObject:newValue];
+            
+            [self setDocumentEdited:YES];
+        }
     }
 }
 
 - (IBAction)changeOptionalField:(id)sender {
     NSInteger row = [optionalTableView rowForView:sender];
-    // NSDictionary copies its keys, so types may be the only thing retaining 
oldValue (see bug #1596532)
-    NSString *oldValue = [currentOptionalFields objectAtIndex:row];
-    NSString *newValue = [[sender stringValue] fieldName];
-    if (NO == [newValue isEqualToString:oldValue] &&
-        NO == [currentRequiredFields containsObject:newValue] &&
-        NO == [currentOptionalFields containsObject:newValue]) {
-        
-        [currentOptionalFields replaceObjectAtIndex:row withObject:newValue];
-        
-        [self setDocumentEdited:YES];
+    if (row >= 0) {
+        // NSDictionary copies its keys, so types may be the only thing 
retaining oldValue (see bug #1596532)
+        NSString *oldValue = [currentOptionalFields objectAtIndex:row];
+        NSString *newValue = [[sender stringValue] fieldName];
+        if (NO == [newValue isEqualToString:oldValue] &&
+            NO == [currentRequiredFields containsObject:newValue] &&
+            NO == [currentOptionalFields containsObject:newValue]) {
+            
+            [currentOptionalFields replaceObjectAtIndex:row 
withObject:newValue];
+            
+            [self setDocumentEdited:YES];
+        }
     }
 }
 

Modified: trunk/bibdesk/BDSKTypeManager.m
===================================================================
--- trunk/bibdesk/BDSKTypeManager.m     2021-11-25 07:30:37 UTC (rev 27154)
+++ trunk/bibdesk/BDSKTypeManager.m     2021-11-25 15:09:06 UTC (rev 27155)
@@ -273,7 +273,7 @@
 
 - (void)updateUserTypes:(NSArray *)newTypes andFields:(NSDictionary 
*)newFieldsForTypes {
     BDSKPRECONDITION(newFieldsForTypes != nil);
-    BDSKPRECONDITION(newTypes = nil);
+    BDSKPRECONDITION(newTypes != nil);
     
     NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
                 newFieldsForTypes, FIELDS_FOR_TYPES_KEY, 

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