// // CLTimezoneCellView.m // Clocker // // Created by Abhishek Banthia on 12/13/15. // // #import "CLTimezoneCellView.h" #import "PanelController.h" #import "CommonStrings.h" #import "CLTimezoneData.h" #import "CLFloatingWindowController.h" #define MIN_FONT_SIZE 13 @implementation CLTimezoneCellView - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; // Drawing code here. } - (IBAction)labelDidChange:(NSTextField *)sender { NSTextField *customLabelCell = (NSTextField*) sender; PanelController *panelController; CLFloatingWindowController *floatingWindow; NSNumber *displayMode = [[NSUserDefaults standardUserDefaults] objectForKey:CLShowAppInForeground]; if (displayMode.integerValue == 0) { panelController = [PanelController getPanelControllerInstance]; } else if (displayMode.integerValue == 1) { floatingWindow = [CLFloatingWindowController sharedFloatingWindow]; } NSString *originalValue = customLabelCell.stringValue; NSString *customLabelValue = [originalValue stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; if ([sender.superview isKindOfClass:[self class]]) { CLTimezoneCellView *cellView = (CLTimezoneCellView *)sender.superview; /* Fix for http://crashes.to/s/f43ce0accd0 More stringent null check for array values. */ if (panelController.defaultPreferences == nil && floatingWindow.defaultPreferences == nil) { return; } NSData *dataObject = displayMode.integerValue == 0 ? panelController.defaultPreferences[cellView.rowNumber] : floatingWindow.defaultPreferences[cellView.rowNumber]; CLTimezoneData *timezoneObject = [CLTimezoneData getCustomObject:dataObject]; if (displayMode.integerValue == 0) { [panelController.defaultPreferences enumerateObjectsUsingBlock:^(id _Nonnull object, NSUInteger idx, BOOL * _Nonnull stop) { CLTimezoneData *timeObject = [CLTimezoneData getCustomObject:object]; if ([timeObject.formattedAddress isEqualToString:customLabelValue]) { [timeObject setLabelForTimezone:CLEmptyString]; } }]; } else if (displayMode.integerValue == 1) { [floatingWindow.defaultPreferences enumerateObjectsUsingBlock:^(id _Nonnull object, NSUInteger idx, BOOL * _Nonnull stop) { CLTimezoneData *timeObject = [CLTimezoneData getCustomObject:object]; if ([timeObject.formattedAddress isEqualToString:customLabelValue]) { [timeObject setLabelForTimezone:CLEmptyString]; } }]; } [timezoneObject setLabelForTimezone:customLabelValue]; if ([timezoneObject.isFavourite isEqualToNumber:@1]) { NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:timezoneObject]; [[NSUserDefaults standardUserDefaults] setObject:encodedObject forKey:@"favouriteTimezone"]; } NSData *newObject = [NSKeyedArchiver archivedDataWithRootObject:timezoneObject]; if (displayMode.integerValue == 0) { (panelController.defaultPreferences)[cellView.rowNumber] = newObject; [[NSUserDefaults standardUserDefaults] setObject:panelController.defaultPreferences forKey:CLDefaultPreferenceKey]; [panelController updateDefaultPreferences]; [panelController updateTableContent]; } else if(displayMode.integerValue == 1) { (floatingWindow.defaultPreferences)[cellView.rowNumber] = newObject; [[NSUserDefaults standardUserDefaults] setObject:floatingWindow.defaultPreferences forKey:CLDefaultPreferenceKey]; [floatingWindow updateDefaultPreferences]; [floatingWindow updateTableContent]; } [[NSNotificationCenter defaultCenter] postNotificationName:CLCustomLabelChangedNotification object:nil]; } } -(void)mouseDown:(NSEvent *)theEvent { [self.window endEditingFor:nil]; } - (void)setTextColor:(NSColor *)color { self.relativeDate.textColor = color; self.customName.textColor = color; self.time.textColor = color; self.sunriseSetTime.textColor = color; } - (void)setUpLayout { CGFloat width = [self.relativeDate.stringValue sizeWithAttributes: @{NSFontAttributeName:self.relativeDate.font}].width; CGFloat sunriseWidth = [self.sunriseSetTime.stringValue sizeWithAttributes: @{NSFontAttributeName:self.sunriseSetTime.font}].width; [self.relativeDate.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint * _Nonnull constraint, NSUInteger idx, BOOL * _Nonnull stop) { if (constraint.constant > 20) { constraint.constant = width+8; } }]; [self.sunriseSetTime.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint * _Nonnull constraint, NSUInteger idx, BOOL * _Nonnull stop) { if ([constraint.identifier isEqualToString:@"width"]) { constraint.constant = sunriseWidth+3; } }]; [self.relativeDate setNeedsUpdateConstraints:YES]; [self.sunriseSetTime setNeedsUpdateConstraints:YES]; [self setUpTheme]; } - (void)setUpTheme { NSNumber *theme = [[NSUserDefaults standardUserDefaults] objectForKey:CLThemeKey]; if (theme.integerValue == 1) { [self setTextColor:[NSColor whiteColor]]; self.customName.drawsBackground = YES; self.customName.backgroundColor = [NSColor blackColor]; } else { self.customName.drawsBackground = NO; self.customName.backgroundColor = [NSColor whiteColor]; [self setTextColor:[NSColor blackColor]]; } [self setUpTextSize]; } - (void)setUpTextSize { NSNumber *userFontSize = [[NSUserDefaults standardUserDefaults] objectForKey:CLUserFontSizePreference]; NSInteger newFontSize = MIN_FONT_SIZE + (userFontSize.integerValue*2); NSFontManager *fontManager = [NSFontManager sharedFontManager]; NSFont *customPlaceFont = [fontManager convertFont:self.customName.font toSize:newFontSize]; NSFont *customTimeFont = [fontManager convertFont:self.time.font toSize:MIN_FONT_SIZE + (userFontSize.integerValue*3)]; [self.customName setFont:customPlaceFont]; [self.time setFont:customTimeFont]; CGFloat timeHeight = [self.time.stringValue sizeWithAttributes: @{NSFontAttributeName:self.time.font}].height; CGFloat timeWidth = [self.time.stringValue sizeWithAttributes: @{NSFontAttributeName:self.time.font}].width; [self.time.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint * _Nonnull constraint, NSUInteger idx, BOOL * _Nonnull stop) { if([constraint.identifier isEqualToString:@"height"]) { constraint.constant = timeHeight; } else { constraint.constant = timeWidth; } }]; } - (void)controlTextDidEndEditing:(NSNotification *)obj { CLFloatingWindowController *windowController = [CLFloatingWindowController sharedFloatingWindow]; [windowController.floatingWindowTimer start]; } @end