Skip to content

Commit ea1325b

Browse files
committed
It was possible to enable the filter rule editor when no table was selected, which caused an exception when changing views #3255
1 parent 145ee33 commit ea1325b

File tree

4 files changed

+20
-3
lines changed

4 files changed

+20
-3
lines changed

Source/SPCompatibility.h

+3
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ typedef struct {
176176

177177
#if __MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13
178178

179+
// was an anonymous enum before
180+
#define NSFontPanelModeMask NSUInteger
181+
179182
#endif
180183

181184
#pragma mark - 10.14 Mojave

Source/SPDatabaseDocument.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -3598,7 +3598,7 @@ - (IBAction) makeTableListFilterHaveFocus:(id)sender
35983598

35993599
/**
36003600
* Menu item validation.
3601-
*/
3601+
*/
36023602
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
36033603
{
36043604
SEL action = [menuItem action];

Source/SPRuleFilterController.m

+10-2
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,9 @@ - (BOOL)isEmpty
921921

922922
- (void)addFilterExpression
923923
{
924+
// reject this if no table columns exist: would cause invalid state (empty filter rows)
925+
if(![columns count]) return;
926+
924927
[filterRuleEditor insertRowAtIndex:0 withType:NSRuleEditorRowTypeSimple asSubrowOfRow:-1 animate:NO];
925928
}
926929

@@ -979,7 +982,8 @@ - (NSDictionary *)_serializedFilterIncludingFilterDefinition:(BOOL)includeDefini
979982
{
980983
NSMutableArray *rootItems = [NSMutableArray arrayWithCapacity:[[_modelContainer model] count]];
981984
for(NSDictionary *item in [_modelContainer model]) {
982-
[rootItems addObject:[self _serializeSubtree:item includingDefinition:includeDefinition]];
985+
NSDictionary *sub = [self _serializeSubtree:item includingDefinition:includeDefinition];
986+
if(sub) [rootItems addObject:sub];
983987
}
984988
//the root serialized filter can either be an AND of multiple root items or a single root item
985989
if([rootItems count] == 1) {
@@ -1003,7 +1007,8 @@ - (NSDictionary *)_serializeSubtree:(NSDictionary *)item includingDefinition:(BO
10031007
NSArray *subrows = [item objectForKey:@"subrows"];
10041008
NSMutableArray *children = [[NSMutableArray alloc] initWithCapacity:[subrows count]];
10051009
for(NSDictionary *subitem in subrows) {
1006-
[children addObject:[self _serializeSubtree:subitem includingDefinition:includeDefinition]];
1010+
NSDictionary *sub = [self _serializeSubtree:subitem includingDefinition:includeDefinition];
1011+
if(sub) [children addObject:sub];
10071012
}
10081013
StringNode *node = [[item objectForKey:@"criteria"] objectAtIndex:0];
10091014
BOOL isConjunction = [@"AND" isEqualToString:[node value]];
@@ -1018,6 +1023,9 @@ - (NSDictionary *)_serializeSubtree:(NSDictionary *)item includingDefinition:(BO
10181023
else {
10191024
NSArray *criteria = [item objectForKey:@"criteria"];
10201025
NSArray *displayValues = [item objectForKey:@"displayValues"];
1026+
if([criteria count] < 2 || [criteria count] != [displayValues count]) {
1027+
return nil;
1028+
}
10211029
ColumnNode *col = [criteria objectAtIndex:0];
10221030
OpNode *op = [criteria objectAtIndex:1];
10231031
NSMutableArray *filterValues = [[NSMutableArray alloc] initWithCapacity:2];

Source/SPTableContent.m

+6
Original file line numberDiff line numberDiff line change
@@ -3931,6 +3931,12 @@ - (id)_contentValueForTableColumn:(NSUInteger)columnIndex row:(NSUInteger)rowInd
39313931
*/
39323932
- (void)makeContentFilterHaveFocus
39333933
{
3934+
// don't show the filter UI if no table is selected - would result in invalid state
3935+
if (!selectedTable || [selectedTable isEqualToString:@""]) {
3936+
NSBeep();
3937+
return;
3938+
}
3939+
39343940
[self setRuleEditorVisible:YES animate:YES];
39353941
[toggleRuleFilterButton setState:NSOnState];
39363942
[ruleFilterController focusFirstInputField];

0 commit comments

Comments
 (0)