- CGSize indsize([UIProgressIndicator defaultSizeForStyle:[indicator_ activityIndicatorViewStyle]]);
- unsigned indoffset = ([self frame].size.height - indsize.height) / 2;
- CGRect indrect = {{indoffset, indoffset}, indsize};
- [indicator_ setFrame:indrect];
-
- CGSize prmsize = {215, indsize.height + 4};
- CGRect prmrect = {{
- indoffset * 2 + indsize.width,
- unsigned([self frame].size.height - prmsize.height) / 2 - 1
- }, prmsize};
- [prompt_ setFrame:prmrect];
-}
-
-- (void) setFrame:(CGRect)frame {
- [super setFrame:frame];
- [self positionViews];
-}
-
-- (id) initWithFrame:(CGRect)frame delegate:(id)delegate {
- if ((self = [super initWithFrame:frame]) != nil) {
- [self setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
-
- [self setBarStyle:UIBarStyleBlack];
-
- UIBarStyle barstyle([self _barStyle:NO]);
- bool ugly(barstyle == UIBarStyleDefault);
-
- UIProgressIndicatorStyle style = ugly ?
- UIProgressIndicatorStyleMediumBrown :
- UIProgressIndicatorStyleMediumWhite;
-
- indicator_ = [[[UIProgressIndicator alloc] initWithFrame:CGRectZero] autorelease];
- [(UIProgressIndicator *) indicator_ setStyle:style];
- [indicator_ startAnimation];
- [self addSubview:indicator_];
-
- prompt_ = [[[UITextLabel alloc] initWithFrame:CGRectZero] autorelease];
- [prompt_ setColor:[UIColor colorWithCGColor:(ugly ? Blueish_ : Off_)]];
- [prompt_ setBackgroundColor:[UIColor clearColor]];
- [prompt_ setFont:[UIFont systemFontOfSize:15]];
- [self addSubview:prompt_];
-
- progress_ = [[[UIProgressBar alloc] initWithFrame:CGRectZero] autorelease];
- [progress_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin];
- [(UIProgressBar *) progress_ setStyle:0];
- [self addSubview:progress_];
-
- cancel_ = [[[UINavigationButton alloc] initWithTitle:UCLocalize("CANCEL") style:UINavigationButtonStyleHighlighted] autorelease];
- [cancel_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
- [cancel_ addTarget:delegate action:@selector(cancelPressed) forControlEvents:UIControlEventTouchUpInside];
- [cancel_ setBarStyle:barstyle];
-
- [self positionViews];
- } return self;
-}
-
-- (void) setCancellable:(bool)cancellable {
- if (cancellable)
- [self addSubview:cancel_];
- else
- [cancel_ removeFromSuperview];
-}
-
-- (void) start {
- [prompt_ setText:UCLocalize("UPDATING_DATABASE")];
- [progress_ setProgress:0];
-}
-
-- (void) stop {
- [self setCancellable:NO];
-}
-
-- (void) setPrompt:(NSString *)prompt {
- [prompt_ setText:prompt];
-}
-
-- (void) setProgress:(float)progress {
- [progress_ setProgress:progress];
-}
-
-@end
-/* }}} */
-
-/* Cydia Navigation Controller Interface {{{ */
-@interface UINavigationController (Cydia)
-
-- (NSArray *) navigationURLCollection;
-- (void) unloadData;
-
-@end
-/* }}} */
-
-/* Cydia Tab Bar Controller {{{ */
-@interface CYTabBarController : UITabBarController <
- UITabBarControllerDelegate,
- ProgressDelegate
-> {
- _transient Database *database_;
- _H<RefreshBar, 1> refreshbar_;
-
- bool dropped_;
- bool updating_;
- // XXX: ok, "updatedelegate_"?...
- _transient NSObject<CydiaDelegate> *updatedelegate_;
-
- _H<UIViewController> remembered_;
- _transient UIViewController *transient_;
-}
-
-- (NSArray *) navigationURLCollection;
-- (void) dropBar:(BOOL)animated;
-- (void) beginUpdate;
-- (void) raiseBar:(BOOL)animated;
-- (BOOL) updating;
-- (void) unloadData;
-
-@end
-
-@implementation CYTabBarController
-
-- (void) didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
-
- // presenting a UINavigationController on 2.x does not update its transitionView
- // it thereby will not allow its topViewController to be unloaded by memory pressure
- if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) {
- UIViewController *selected([self selectedViewController]);
- for (UINavigationController *controller in [self viewControllers])
- if (controller != selected)
- if (UIViewController *top = [controller topViewController])
- [top unloadView];
- }
-}
-
-- (void) setUnselectedViewController:(UIViewController *)transient {
- if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) {
- if (transient != nil) {
- [[[self viewControllers] objectAtIndex:0] pushViewController:transient animated:YES];
- [self setSelectedIndex:0];
- } return;
- }
-
- NSMutableArray *controllers = [[[self viewControllers] mutableCopy] autorelease];
- if (transient != nil) {
- UINavigationController *navigation([[[UINavigationController alloc] init] autorelease]);
- [navigation setViewControllers:[NSArray arrayWithObject:transient]];
- transient = navigation;
-
- if (transient_ == nil)
- remembered_ = [controllers objectAtIndex:0];
- transient_ = transient;
- [transient_ setTabBarItem:[remembered_ tabBarItem]];
- [controllers replaceObjectAtIndex:0 withObject:transient_];
- [self setSelectedIndex:0];
- [self setViewControllers:controllers];
- [self concealTabBarSelection];
- } else if (remembered_ != nil) {
- [remembered_ setTabBarItem:[transient_ tabBarItem]];
- transient_ = transient;
- [controllers replaceObjectAtIndex:0 withObject:remembered_];
- remembered_ = nil;
- [self setViewControllers:controllers];
- [self revealTabBarSelection];
- }
-}
-
-- (UIViewController *) unselectedViewController {
- return transient_;
-}
-
-- (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
- if ([self unselectedViewController])
- [self setUnselectedViewController:nil];
-
- // presenting a UINavigationController on 2.x does not update its transitionView
- // if this view was unloaded, the tranitionView may currently be presenting nothing
- if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) {
- UINavigationController *navigation((UINavigationController *) viewController);
- [navigation pushViewController:[[[UIViewController alloc] init] autorelease] animated:NO];
- [navigation popViewControllerAnimated:NO];
- }
-}
-
-- (NSArray *) navigationURLCollection {
- NSMutableArray *items([NSMutableArray array]);
-
- // XXX: Should this deal with transient view controllers?
- for (id navigation in [self viewControllers]) {
- NSArray *stack = [navigation performSelector:@selector(navigationURLCollection)];
- if (stack != nil)
- [items addObject:stack];
- }
-
- return items;
-}
-
-- (void) dismissModalViewControllerAnimated:(BOOL)animated {
- if ([self modalViewController] == nil && [self unselectedViewController] != nil)
- [self setUnselectedViewController:nil];
- else
- [super dismissModalViewControllerAnimated:YES];
-}
-
-- (void) unloadData {
- [super unloadData];
-
- for (UINavigationController *controller in [self viewControllers])
- [controller unloadData];
-
- if (UIViewController *selected = [self selectedViewController])
- [selected reloadData];
-
- if (UIViewController *unselected = [self unselectedViewController]) {
- [unselected unloadData];
- [unselected reloadData];
- }
-}
-
-- (void) dealloc {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- [super dealloc];
-}
-
-- (id) initWithDatabase:(Database *)database {
- if ((self = [super init]) != nil) {
- database_ = database;
- [self setDelegate:self];
-
- [[self view] setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameChanged:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
-
- refreshbar_ = [[[RefreshBar alloc] initWithFrame:CGRectMake(0, 0, [[self view] frame].size.width, [UINavigationBar defaultSize].height) delegate:self] autorelease];
- } return self;
-}
-
-- (void) setUpdate:(NSDate *)date {
- [self beginUpdate];
-}
-
-- (void) beginUpdate {
- [(RefreshBar *) refreshbar_ start];
- [self dropBar:YES];
-
- [updatedelegate_ retainNetworkActivityIndicator];
- updating_ = true;