|
|
|
|
|
|
|
|
|
|
|
#import "MenubarController.h"
|
|
|
|
#import "StatusItemView.h"
|
|
|
|
#import "CLTimezoneData.h"
|
|
|
|
#import "ApplicationDelegate.h"
|
|
|
|
#import "CLTimezoneDataOperations.h"
|
|
|
|
|
|
|
|
typedef void (^CompletionType)(void);
|
|
|
|
|
|
|
|
@implementation MenubarController
|
|
|
|
|
|
|
|
@synthesize statusItemView = _statusItemView;
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
|
|
|
|
- (instancetype)init
|
|
|
|
{
|
|
|
|
self = [super init];
|
|
|
|
if (self != nil)
|
|
|
|
{
|
|
|
|
// Install status item into the menu bar
|
|
|
|
NSData *dataObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"favouriteTimezone"];
|
|
|
|
|
|
|
|
NSStatusItem *statusItem;
|
|
|
|
NSTextField *textField;
|
|
|
|
|
|
|
|
if (dataObject)
|
|
|
|
{
|
|
|
|
CLTimezoneData *timezoneObject = [CLTimezoneData getCustomObject:dataObject];
|
|
|
|
CLTimezoneDataOperations *operationObject = [[CLTimezoneDataOperations alloc] initWithTimezoneData:timezoneObject];
|
|
|
|
|
|
|
|
|
|
|
|
NSString *menuTitle = [operationObject getMenuTitle];
|
|
|
|
|
|
|
|
textField = [self setUpTextfieldForMenubar];
|
|
|
|
textField.stringValue = (menuTitle.length > 0) ? menuTitle : @"Icon";
|
|
|
|
[textField sizeToFit];
|
|
|
|
|
|
|
|
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:textField.frame.size.width+3];
|
|
|
|
|
|
|
|
[self setUpTimerForUpdatingMenubar];
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:STATUS_ITEM_VIEW_WIDTH];
|
|
|
|
|
|
|
|
[self invalidateTimerForMenubar];
|
|
|
|
}
|
|
|
|
|
|
|
|
_statusItemView = [[StatusItemView alloc] initWithStatusItem:statusItem];
|
|
|
|
if (dataObject)
|
|
|
|
{
|
|
|
|
_statusItemView.image = [self convertTextfieldRepresentationToImage:textField];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"] isEqualToString:@"Dark"])
|
|
|
|
{
|
|
|
|
_statusItemView.image = [NSImage imageNamed:@"DarkModeIcon"];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_statusItemView.image = [NSImage imageNamed:@"LightModeIcon"];
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
_statusItemView.alternateImage = [NSImage imageNamed:@"StatusHighlighted"];
|
|
|
|
_statusItemView.action = @selector(togglePanel:);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSTextField *)setUpTextfieldForMenubar
|
|
|
|
{
|
|
|
|
NSTextField *textField= [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, STATUS_ITEM_VIEW_WIDTH, 22)];
|
|
|
|
textField.backgroundColor = [NSColor whiteColor];
|
|
|
|
textField.bordered = NO;
|
|
|
|
textField.textColor = [NSColor blackColor];
|
|
|
|
textField.alignment = NSTextAlignmentCenter;
|
|
|
|
|
|
|
|
return textField;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)updateMenubar
|
|
|
|
{
|
|
|
|
[self.statusItemView setNeedsDisplay:YES];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setUpTimerForUpdatingMenubar
|
|
|
|
{
|
|
|
|
self.checkIfMenubarUpdatingWasCancelled = NO;
|
|
|
|
[self tryingSomethingHere];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)tryingSomethingHere
|
|
|
|
{
|
|
|
|
|
|
|
|
//a block calling itself without the ARC retain warning
|
|
|
|
__block CompletionType completionBlock = nil;
|
|
|
|
__block __weak CompletionType weakCompletionBlock = nil;
|
|
|
|
completionBlock = ^(void) {
|
|
|
|
|
|
|
|
|
|
|
|
double delayInSeconds = 1.0;
|
|
|
|
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
|
|
|
|
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
|
|
|
|
|
|
|
|
|
|
|
|
if(!self.checkIfMenubarUpdatingWasCancelled)
|
|
|
|
{
|
|
|
|
[self updateMenubar];
|
|
|
|
weakCompletionBlock = completionBlock;
|
|
|
|
weakCompletionBlock();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
completionBlock();
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)stoppingTheMenubar
|
|
|
|
{
|
|
|
|
self.checkIfMenubarUpdatingWasCancelled = YES;
|
|
|
|
[self.statusItemView setNeedsDisplay:YES];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)invalidateTimerForMenubar
|
|
|
|
{
|
|
|
|
[self stoppingTheMenubar];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSImage *)convertTextfieldRepresentationToImage:(NSTextField *)textField
|
|
|
|
{
|
|
|
|
NSSize textfieldSize = textField.bounds.size;
|
|
|
|
NSSize imgSize = NSMakeSize(textfieldSize.width, textfieldSize.height);
|
|
|
|
|
|
|
|
NSBitmapImageRep *bitmapRepresentation = [textField bitmapImageRepForCachingDisplayInRect:textField.bounds];
|
|
|
|
bitmapRepresentation.size = imgSize;
|
|
|
|
[textField cacheDisplayInRect:textField.bounds toBitmapImageRep:bitmapRepresentation];
|
|
|
|
|
|
|
|
NSImage* image = [[NSImage alloc] initWithSize:imgSize];
|
|
|
|
[image addRepresentation:bitmapRepresentation];
|
|
|
|
return image;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)dealloc
|
|
|
|
{
|
|
|
|
[[NSStatusBar systemStatusBar] removeStatusItem:self.statusItem];
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Public accessors
|
|
|
|
|
|
|
|
- (NSStatusItem *)statusItem
|
|
|
|
{
|
|
|
|
return self.statusItemView.statusItem;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
|
|
|
|
- (BOOL)hasActiveIcon
|
|
|
|
{
|
|
|
|
return self.statusItemView.isHighlighted;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setHasActiveIcon:(BOOL)flag
|
|
|
|
{
|
|
|
|
self.statusItemView.isHighlighted = flag;
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|