diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/NSNotificationAdditions.h | 34 | ||||
-rw-r--r-- | Source/NSNotificationAdditions.m | 75 | ||||
-rw-r--r-- | Source/TableContent.m | 3 | ||||
-rw-r--r-- | Source/TableDocument.h | 2 | ||||
-rw-r--r-- | Source/TableDocument.m | 18 | ||||
-rw-r--r-- | Source/TablesList.m | 12 | ||||
-rw-r--r-- | Source/YRKSpinningProgressIndicator.m | 1 |
7 files changed, 136 insertions, 9 deletions
diff --git a/Source/NSNotificationAdditions.h b/Source/NSNotificationAdditions.h new file mode 100644 index 00000000..37fe4c0e --- /dev/null +++ b/Source/NSNotificationAdditions.h @@ -0,0 +1,34 @@ +// +// $Id$ +// +// NSNotificationAdditions.h +// sequel-pro +// +// Copied from the Colloquy project; original code available from Trac at +// http://colloquy.info/project/browser/trunk/Additions/NSNotificationAdditions.h +// +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at <http://code.google.com/p/sequel-pro/> + +@interface NSNotificationCenter (NSNotificationCenterAdditions) +- (void) postNotificationOnMainThread:(NSNotification *) notification; +- (void) postNotificationOnMainThread:(NSNotification *) notification waitUntilDone:(BOOL) wait; + +- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object; +- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object userInfo:(NSDictionary *) userInfo; +- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object userInfo:(NSDictionary *) userInfo waitUntilDone:(BOOL) wait; +@end diff --git a/Source/NSNotificationAdditions.m b/Source/NSNotificationAdditions.m new file mode 100644 index 00000000..2e075ed3 --- /dev/null +++ b/Source/NSNotificationAdditions.m @@ -0,0 +1,75 @@ +// +// $Id$ +// +// NSNotificationAdditions.m +// sequel-pro +// +// Copied from the Colloquy project; original code available from Trac at +// http://colloquy.info/project/browser/trunk/Additions/NSNotificationAdditions.m +// +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "NSNotificationAdditions.h" +#import <pthread.h> + +@implementation NSNotificationCenter (NSNotificationCenterAdditions) +- (void) postNotificationOnMainThread:(NSNotification *) notification { + if( pthread_main_np() ) return [self postNotification:notification]; + [self postNotificationOnMainThread:notification waitUntilDone:NO]; +} + +- (void) postNotificationOnMainThread:(NSNotification *) notification waitUntilDone:(BOOL) wait { + if( pthread_main_np() ) return [self postNotification:notification]; + [[self class] performSelectorOnMainThread:@selector( _postNotification: ) withObject:notification waitUntilDone:wait]; +} + ++ (void) _postNotification:(NSNotification *) notification { + [[self defaultCenter] postNotification:notification]; +} + +- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object { + if( pthread_main_np() ) return [self postNotificationName:name object:object userInfo:nil]; + [self postNotificationOnMainThreadWithName:name object:object userInfo:nil waitUntilDone:NO]; +} + +- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object userInfo:(NSDictionary *) userInfo { + if( pthread_main_np() ) return [self postNotificationName:name object:object userInfo:userInfo]; + [self postNotificationOnMainThreadWithName:name object:object userInfo:userInfo waitUntilDone:NO]; +} + +- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object userInfo:(NSDictionary *) userInfo waitUntilDone:(BOOL) wait { + if( pthread_main_np() ) return [self postNotificationName:name object:object userInfo:userInfo]; + + NSMutableDictionary *info = [[NSMutableDictionary allocWithZone:nil] initWithCapacity:3]; + if( name ) [info setObject:name forKey:@"name"]; + if( object ) [info setObject:object forKey:@"object"]; + if( userInfo ) [info setObject:userInfo forKey:@"userInfo"]; + + [[self class] performSelectorOnMainThread:@selector( _postNotificationName: ) withObject:info waitUntilDone:wait]; + + [info release]; +} + ++ (void) _postNotificationName:(NSDictionary *) info { + NSString *name = [info objectForKey:@"name"]; + id object = [info objectForKey:@"object"]; + NSDictionary *userInfo = [info objectForKey:@"userInfo"]; + + [[self defaultCenter] postNotificationName:name object:object userInfo:userInfo]; +} +@end diff --git a/Source/TableContent.m b/Source/TableContent.m index 60a7ce4a..bcaed509 100644 --- a/Source/TableContent.m +++ b/Source/TableContent.m @@ -638,7 +638,8 @@ if (rowsProcessed < targetRowCount) { [tableDocumentInstance setTaskPercentage:(rowsProcessed*relativeTargetRowCount)]; } else if (rowsProcessed == targetRowCount) { - [tableDocumentInstance performSelectorOnMainThread:@selector(setTaskProgressToIndeterminate) withObject:nil waitUntilDone:NO]; + [tableDocumentInstance setTaskPercentage:100.0]; + [tableDocumentInstance performSelectorOnMainThread:@selector(setTaskProgressToIndeterminateAfterDelay:) withObject:[NSNumber numberWithBool:YES] waitUntilDone:NO]; } } diff --git a/Source/TableDocument.h b/Source/TableDocument.h index db4b48ae..8164746a 100644 --- a/Source/TableDocument.h +++ b/Source/TableDocument.h @@ -187,7 +187,7 @@ - (void) showTaskProgressWindow:(NSTimer *)theTimer; - (void) setTaskDescription:(NSString *)description; - (void) setTaskPercentage:(float)taskPercentage; -- (void) setTaskProgressToIndeterminate; +- (void) setTaskProgressToIndeterminateAfterDelay:(BOOL)afterDelay; - (void) endTask; - (void) enableTaskCancellationWithTitle:(NSString *)buttonTitle callbackObject:(id)callbackObject callbackFunction:(SEL)callbackFunction; - (void) disableTaskCancellation; diff --git a/Source/TableDocument.m b/Source/TableDocument.m index 4e0f68fc..98a231ab 100644 --- a/Source/TableDocument.m +++ b/Source/TableDocument.m @@ -1266,7 +1266,7 @@ [[NSNotificationCenter defaultCenter] postNotificationName:SPDocumentTaskStartNotification object:self]; // Schedule appearance of the task window in the near future - taskDrawTimer = [[NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(showTaskProgressWindow:) userInfo:nil repeats:NO] retain]; + taskDrawTimer = [[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(showTaskProgressWindow:) userInfo:nil repeats:NO] retain]; } } @@ -1306,6 +1306,7 @@ if (taskDisplayIsIndeterminate) { taskDisplayIsIndeterminate = NO; [taskProgressIndicator stopAnimation:self]; + [taskProgressIndicator setDoubleValue:0.5]; } taskProgressValue = taskPercentage; @@ -1319,10 +1320,17 @@ /** * Sets the task progress indicator back to indeterminate (also performed - * automatically whenever a new task is started) + * automatically whenever a new task is started). + * This can optionally be called with afterDelay set, in which case the intederminate + * switch will be made a fter a short pause to minimise flicker for short actions. */ -- (void) setTaskProgressToIndeterminate +- (void) setTaskProgressToIndeterminateAfterDelay:(BOOL)afterDelay { + if (afterDelay) { + [self performSelector:@selector(setTaskProgressToIndeterminateAfterDelay:) withObject:nil afterDelay:0.5]; + return; + } + if (taskDisplayIsIndeterminate) return; taskDisplayIsIndeterminate = YES; [taskProgressIndicator setIndeterminate:YES]; @@ -1354,9 +1362,11 @@ [taskFadeAnimator release], taskFadeAnimator = nil; } - // Hide the task interface + // Hide the task interface and reset to indeterminate if (taskDisplayIsIndeterminate) [taskProgressIndicator stopAnimation:self]; [taskProgressWindow setAlphaValue:0.0]; + taskDisplayIsIndeterminate = YES; + [taskProgressIndicator setIndeterminate:YES]; // Re-enable window interface [historyControl setEnabled:YES]; diff --git a/Source/TablesList.m b/Source/TablesList.m index f37be72e..eabf062f 100644 --- a/Source/TablesList.m +++ b/Source/TablesList.m @@ -35,6 +35,7 @@ #import "RegexKitLite.h" #import "SPDatabaseData.h" #import "NSMutableArray-MultipleSort.h" +#import "NSNotificationAdditions.h" #import "SPConstants.h" @interface TablesList (PrivateAPI) @@ -738,6 +739,14 @@ // Reset the table information caches [tableDataInstance resetAllData]; + if (selectedTableType == SP_TABLETYPE_TABLE) { + [tableDataInstance updateInformationForCurrentTable]; + } else if (selectedTableType == SP_TABLETYPE_VIEW) { + [tableDataInstance updateInformationForCurrentView]; + } + + // Notify listeners of the table change now that the state is fully set up. + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:SPTableChangedNotification object:tableDocumentInstance]; [separatorTableMenuItem setHidden:NO]; [separatorTableContextMenuItem setHidden:NO]; @@ -921,9 +930,6 @@ // Add a history entry [spHistoryControllerInstance updateHistoryEntries]; - - // Notify listeners of the table change now that the state is fully set up - [[NSNotificationCenter defaultCenter] postNotificationName:SPTableChangedNotification object:tableDocumentInstance]; // Empty the loading pool and exit the thread [tableDocumentInstance endTask]; diff --git a/Source/YRKSpinningProgressIndicator.m b/Source/YRKSpinningProgressIndicator.m index 4d211be3..cca0a28c 100644 --- a/Source/YRKSpinningProgressIndicator.m +++ b/Source/YRKSpinningProgressIndicator.m @@ -192,6 +192,7 @@ - (void)startAnimation:(id)sender { + if (!_isIndeterminate) return; if (_isAnimating) return; _isAnimating = YES; |