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