diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/SPTableContent.h | 2 | ||||
-rw-r--r-- | Source/SPTableContent.m | 74 |
2 files changed, 58 insertions, 18 deletions
diff --git a/Source/SPTableContent.h b/Source/SPTableContent.h index 13ca3d92..fca3fdae 100644 --- a/Source/SPTableContent.h +++ b/Source/SPTableContent.h @@ -203,6 +203,6 @@ - (NSArray*)fieldEditStatusForRow:(NSInteger)rowIndex andColumn:(NSInteger)columnIndex; -- (void)updateFilterTableClause; +- (void)updateFilterTableClause:(NSString*)currentValue; @end diff --git a/Source/SPTableContent.m b/Source/SPTableContent.m index b7bcd0f9..295dca4b 100644 --- a/Source/SPTableContent.m +++ b/Source/SPTableContent.m @@ -2820,6 +2820,16 @@ - (IBAction)showTableFilter:(id)sender { [filterTableWindow makeKeyAndOrderFront:nil]; + [filterTableWhereClause setContinuousSpellCheckingEnabled:NO]; + [filterTableWhereClause setAutoindent:NO]; + [filterTableWhereClause setAutoindentIgnoresEnter:NO]; + [filterTableWhereClause setAutopair:[prefs boolForKey:SPCustomQueryAutoPairCharacters]]; + [filterTableWhereClause setAutohelp:NO]; + [filterTableWhereClause setAutouppercaseKeywords:[prefs boolForKey:SPCustomQueryAutoUppercaseKeywords]]; + [filterTableWhereClause setCompletionWasReinvokedAutomatically:NO]; + [filterTableWhereClause insertText:@""]; + [filterTableWhereClause didChangeText]; + [[NSApp keyWindow] makeFirstResponder:filterTableView]; } #pragma mark - @@ -3273,7 +3283,7 @@ { if(aTableView == filterTableView) { [[[filterTableData objectForKey:[aTableColumn identifier]] objectForKey:@"filter"] replaceObjectAtIndex:rowIndex withObject:(NSString*)anObject]; - [self updateFilterTableClause]; + [self updateFilterTableClause:nil]; return; } else if(aTableView == tableContentView) { @@ -3876,7 +3886,7 @@ - (void)controlTextDidChange:(NSNotification *)notification { if ([notification object] == filterTableView) { - [self updateFilterTableClause]; + [self updateFilterTableClause:[[[[notification userInfo] objectForKey:@"NSFieldEditor"] textStorage] string]]; } } /** @@ -4022,42 +4032,72 @@ /** * Update WHERE clause in Filter Table Window - TODO not yet finished - initial approach only by HansJB */ -- (void)updateFilterTableClause +- (void)updateFilterTableClause:(NSString*)currentValue { NSMutableString *clause = [NSMutableString string]; NSInteger numberOfRows = [self numberOfRowsInTableView:filterTableView]; NSInteger numberOfCols = [[filterTableView tableColumns] count]; NSInteger numberOfValues = 0; NSRange opRange; + + NSString *re1 = @"^\\s*(<|>|!?=)\\s*(.*?)\\s*$"; + NSString *re2 = @"(?i)^\\s*(.*)\\s+(.*?)\\s*$"; + NSString *defaultOperator = @"LIKE '%%%@%%'"; + NSCharacterSet *whiteSpaceCharSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + for(NSInteger i=0; i<numberOfRows; i++) { numberOfValues = 0; for(NSInteger index=0; index<numberOfCols; index++) { NSString *filterCell; NSDictionary *filterCellData = [NSDictionary dictionaryWithDictionary:[filterTableData objectForKey:[NSNumber numberWithInteger:index]]]; - if([filterCell = [[filterCellData objectForKey:@"filter"] objectAtIndex:i] length]) { + if(currentValue == nil) { + filterCell = NSArrayObjectAtIndex([filterCellData objectForKey:@"filter"], i); + } else { + if(index == [filterTableView editedColumn] && i == [filterTableView editedRow]) + filterCell = currentValue; + else + filterCell = NSArrayObjectAtIndex([filterCellData objectForKey:@"filter"], i); + } + if([filterCell length]) { + if(numberOfValues) [clause appendString:@" AND "]; - opRange = [filterCell rangeOfString:@" "]; - if(opRange.length) { - NSString *op = [[filterCell substringToIndex:opRange.location] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - NSString *pattern = [[filterCell substringFromIndex:NSMaxRange(opRange)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - if([op isEqualToString:@">"] || - [op isEqualToString:@"<"] || - [op isEqualToString:@"="]) { - [clause appendFormat:@"%@ %@ %@", [[filterCellData objectForKey:@"name"] backtickQuotedString], op, pattern]; - } - } else { - [clause appendFormat:@"%@ LIKE '%%%@%%'", [[filterCellData objectForKey:@"name"] backtickQuotedString], filterCell]; + NSString *fieldName = [[filterCellData objectForKey:@"name"] backtickQuotedString]; + + opRange = [filterCell rangeOfString:@"`@`"]; + if(opRange.length) { + filterCell = [filterCell stringByReplacingOccurrencesOfString:@"`@`" withString:fieldName]; + [clause appendString:[filterCell stringByReplacingOccurrencesOfString:@"`@`" withString:fieldName]]; + } + else if([filterCell isMatchedByRegex:@"(?i)^\\s*null\\s*$"]) { + [clause appendFormat:@"%@ IS NULL", fieldName]; + } + else if([filterCell isMatchedByRegex:re1]) { + NSArray *matches = [filterCell arrayOfCaptureComponentsMatchedByRegex:re1]; + if([matches count] && [matches = NSArrayObjectAtIndex(matches,0) count] == 3) + [clause appendFormat:@"%@ %@ %@", fieldName, NSArrayObjectAtIndex(matches, 1), NSArrayObjectAtIndex(matches, 2)]; + } + else if([filterCell isMatchedByRegex:re2]) { + NSArray *matches = [filterCell arrayOfCaptureComponentsMatchedByRegex:re2]; + if([matches count] && [matches = NSArrayObjectAtIndex(matches,0) count] == 3) + [clause appendFormat:@"%@ %@ %@", fieldName, [NSArrayObjectAtIndex(matches, 1) uppercaseString], NSArrayObjectAtIndex(matches, 2)]; } + else { + [clause appendFormat:[NSString stringWithFormat:@"%%@ %@", defaultOperator], fieldName, filterCell]; + } + numberOfValues++; } } if(numberOfValues) [clause appendString:@"\nOR\n"]; } - [filterTableWhereClause setString:[clause substringToIndex:([clause length]-4)]]; - [filterTableWhereClause insertText:@""]; + if([clause length] > 3) + [filterTableWhereClause setString:[clause substringToIndex:([clause length]-4)]]; + else + [filterTableWhereClause setString:@""]; + [filterTableWhereClause insertText:@" "]; [filterTableWhereClause didChangeText]; [filterTableWhereClause scrollRangeToVisible:NSMakeRange(0, 0)]; } |