aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPExportControllerDelegate.m
diff options
context:
space:
mode:
authorrowanbeentje <rowan@beent.je>2011-05-07 15:31:54 +0000
committerrowanbeentje <rowan@beent.je>2011-05-07 15:31:54 +0000
commit0c2a225a68ef1512e51ff3a48fef1fa13eacce60 (patch)
tree624b65144aac2f2a5d57172f8dd7625a5a8e236a /Source/SPExportControllerDelegate.m
parent47a1c49e95403e6da6c9e0ae979144fd5c1dff08 (diff)
downloadsequelpro-0c2a225a68ef1512e51ff3a48fef1fa13eacce60.tar.gz
sequelpro-0c2a225a68ef1512e51ff3a48fef1fa13eacce60.tar.bz2
sequelpro-0c2a225a68ef1512e51ff3a48fef1fa13eacce60.zip
Implement a large number of minor fixes and improvements to export functionality, including an overhaul of filename NSTokenField functionality:
- Improve the NSTokenField used for export filenames: only tokenise reserved tokens, don't tokenise reserved words which are parts of other words, allow the comma to be used, update tokenisation during typing, and prevent whitespace triming. - Save the last selected export path, and make the path selection button open a dialog to the selected directory - Save the export filename and restore on future uses of the export dialog (only if the name contains placeholder tokens, so one-off export names aren't saved) - If the advanced options are collapsed, display a summary of the selected options next to the disclosure triangle - Display a small warning in the corner of the window if the export file cannot be imported into Sequel Pro, to warn those people attempting to back up their databases in XML - Clarify and improve the export warning dialog if files already exist or could not be created; make the simpler file-exists cases reflect OS-style dialogs, alter wording based on the number of files that failed and how they failed, and only show the "replace" or "skip" type buttons if it makes sense to do so. - Fix a mutation-during-enumeration error when skipping files - If "Cancel" is chosen in the export file creation replace/error dialog, redisplay the export sheet with the previous selection still active - Add support for year, month and day tokens in the filename token list - Don't allow blank custom filenames, before or after tokenisation, as this can cause problems - instead fall back to default filenames in those cases - Only append the extension if one hasn't been set - on all export formats, extending r3284 - If exporting to multiple files option is enabled but only one table is selected, supply that table name for filename table tokens - Update the progress bar to reflect update progress when exporting CSV data - Fix a bug causing exports to hang if the low-memory advanced option was set and content was selected to export and any empty tables were encountered - Save memory use and compression advanced export settings across sessions - Update localisable strings
Diffstat (limited to 'Source/SPExportControllerDelegate.m')
-rw-r--r--Source/SPExportControllerDelegate.m76
1 files changed, 76 insertions, 0 deletions
diff --git a/Source/SPExportControllerDelegate.m b/Source/SPExportControllerDelegate.m
index 8f4977a6..e8e9f1c6 100644
--- a/Source/SPExportControllerDelegate.m
+++ b/Source/SPExportControllerDelegate.m
@@ -25,11 +25,13 @@
#import "SPExportControllerDelegate.h"
#import "SPExportFilenameUtilities.h"
+#import "SPExportFileNameTokenObject.h"
// Defined to suppress warnings
@interface SPExportController (SPExportControllerPrivateAPI)
- (void)_toggleExportButtonOnBackgroundThread;
+- (void)_updateExportFormatInformation;
- (void)_switchTab;
@end
@@ -54,6 +56,7 @@
[[tables objectAtIndex:rowIndex] replaceObjectAtIndex:[exportTableList columnWithIdentifier:[tableColumn identifier]] withObject:anObject];
[self _toggleExportButtonOnBackgroundThread];
+ [self _updateExportFormatInformation];
}
#pragma mark -
@@ -80,6 +83,79 @@
}
#pragma mark -
+#pragma mark Token field delegate methods
+
+/**
+ * Use the default token style for matched tokens, plain text for all other text.
+ */
+- (NSTokenStyle)tokenField:(NSTokenField *)tokenField styleForRepresentedObject:(id)representedObject
+{
+ if ([representedObject isKindOfClass:[SPExportFileNameTokenObject class]]) return NSDefaultTokenStyle;
+
+ return NSPlainTextTokenStyle;
+}
+
+/**
+ * Take the default suggestion of new tokens - all untokenized text, as no tokenizing character is set - and
+ * split into many shorter tokens, using non-alphanumeric characters as (preserved) breaks. This preserves
+ * all supplied characters and allows tokens to be typed.
+ */
+- (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)tokens atIndex:(NSUInteger)index
+{
+ NSMutableArray *processedTokens = [NSMutableArray array];
+ NSUInteger i, j;
+ NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
+
+ for (NSString *inputToken in tokens) {
+ j = 0;
+ for (i = 0; i < [inputToken length]; i++) {
+ if (![alphanumericSet characterIsMember:[inputToken characterAtIndex:i]]) {
+ if (i > j) {
+ [processedTokens addObject:[self tokenObjectForString:[inputToken substringWithRange:NSMakeRange(j, i-j)]]];
+ }
+ [processedTokens addObject:[inputToken substringWithRange:NSMakeRange(i, 1)]];
+ j = i+1;
+ }
+ }
+ if (j < i) {
+ [processedTokens addObject:[self tokenObjectForString:[inputToken substringWithRange:NSMakeRange(j, i-j)]]];
+ }
+ }
+
+ return processedTokens;
+}
+
+- (NSString *)tokenField:(NSTokenField *)tokenField displayStringForRepresentedObject:(id)representedObject
+{
+ if ([representedObject isKindOfClass:[SPExportFileNameTokenObject class]]) {
+ return [(SPExportFileNameTokenObject *)representedObject tokenContent];
+ }
+
+ return representedObject;
+}
+
+/**
+ * Return the editing string untouched - implementing this method prevents whitespace trimming.
+ */
+- (id)tokenField:(NSTokenField *)tokenField representedObjectForEditingString:(NSString *)editingString
+{
+ return editingString;
+}
+
+/**
+ * During text entry into the token field, update the displayed filename and also
+ * trigger tokenization after a short delay.
+ */
+- (void)controlTextDidChange:(NSNotification *)aNotification
+{
+ if ([aNotification object] == exportCustomFilenameTokenField) {
+ [self updateDisplayedExportFilename];
+ [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tokenizeCustomFilenameTokenField) object:nil];
+ [self performSelector:@selector(tokenizeCustomFilenameTokenField) withObject:nil afterDelay:0.5];
+ }
+}
+
+#pragma mark -
#pragma mark Combo box delegate methods
- (void)comboBoxSelectionDidChange:(NSNotification *)notification