Abhishek Banthia
9 years ago
4 changed files with 435 additions and 44 deletions
@ -0,0 +1,332 @@
|
||||
// |
||||
// CLFloatingWindowController.m |
||||
// Clocker |
||||
// |
||||
// Created by Abhishek Banthia on 4/2/16. |
||||
// |
||||
// |
||||
|
||||
#import "CLFloatingWindowController.h" |
||||
#import "CLRatingCellView.h" |
||||
#import "CLTimezoneData.h" |
||||
#import "CommonStrings.h" |
||||
#import "CLOneWindowController.h" |
||||
|
||||
@interface CLFloatingWindowController () |
||||
|
||||
@end |
||||
|
||||
static CLFloatingWindowController *sharedFloatingWindow = nil; |
||||
NSString *const CLRatingCellIdentifier = @"ratingCellView"; |
||||
NSString *const CLTimezoneCellIdentifier = @"timeZoneCell"; |
||||
|
||||
@implementation CLFloatingWindowController |
||||
|
||||
- (void)awakeFromNib |
||||
{ |
||||
[super awakeFromNib]; |
||||
|
||||
self.futureSlider.continuous = YES; |
||||
|
||||
if (!self.dateFormatter) |
||||
{ |
||||
self.dateFormatter = [NSDateFormatter new]; |
||||
} |
||||
|
||||
if ([[[NSUserDefaults standardUserDefaults] objectForKey:CLThemeKey] isKindOfClass:[NSString class]]){ |
||||
[[NSUserDefaults standardUserDefaults] setObject:@0 forKey:CLThemeKey]; |
||||
} |
||||
|
||||
NSPanel *panel = (id)[self window]; |
||||
[panel setAcceptsMouseMovedEvents:YES]; |
||||
[panel setLevel:NSPopUpMenuWindowLevel]; |
||||
[panel setOpaque:NO]; |
||||
|
||||
NSNumber *theme = [[NSUserDefaults standardUserDefaults] objectForKey:CLThemeKey]; |
||||
|
||||
if (theme.integerValue == 1) |
||||
{ |
||||
self.shutdownButton.image = [NSImage imageNamed:@"PowerIcon-White"]; |
||||
self.preferencesButton.image = [NSImage imageNamed:@"Settings-White"]; |
||||
self.window.backgroundColor = [NSColor blackColor]; |
||||
[panel setBackgroundColor:[NSColor blackColor]]; |
||||
} |
||||
else |
||||
{ |
||||
self.shutdownButton.image = [NSImage imageNamed:@"PowerIcon"]; |
||||
self.preferencesButton.image = [NSImage imageNamed:NSImageNameActionTemplate]; |
||||
self.window.backgroundColor = [NSColor whiteColor]; |
||||
[panel setBackgroundColor:[NSColor whiteColor]]; |
||||
} |
||||
|
||||
[self updateDefaultPreferences]; |
||||
|
||||
//Register for drag and drop |
||||
[self.mainTableview registerForDraggedTypes: [NSArray arrayWithObject:CLDragSessionKey]]; |
||||
|
||||
self.window.titlebarAppearsTransparent = YES; |
||||
self.window.titleVisibility = NSWindowTitleHidden; |
||||
|
||||
|
||||
|
||||
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. |
||||
} |
||||
|
||||
+ (instancetype)sharedFloatingWindow |
||||
{ |
||||
if (sharedFloatingWindow == nil) |
||||
{ |
||||
/*Using a thread safe pattern*/ |
||||
static dispatch_once_t onceToken; |
||||
dispatch_once(&onceToken, ^{ |
||||
sharedFloatingWindow = [[self alloc] initWithWindowNibName:@"CLFloatingWindow"]; |
||||
|
||||
}); |
||||
} |
||||
return sharedFloatingWindow; |
||||
} |
||||
|
||||
#pragma mark - |
||||
#pragma mark NSTableview Datasource |
||||
#pragma mark - |
||||
|
||||
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView |
||||
{ |
||||
if (self.showReviewCell) { |
||||
return self.defaultPreferences.count+1; |
||||
} |
||||
return self.defaultPreferences.count; |
||||
} |
||||
|
||||
-(NSView*)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row |
||||
{ |
||||
if (self.showReviewCell && row == self.defaultPreferences.count) { |
||||
CLRatingCellView *cellView = [self.mainTableview |
||||
makeViewWithIdentifier:CLRatingCellIdentifier |
||||
owner:self]; |
||||
return cellView; |
||||
} |
||||
|
||||
CLTimezoneCellView *cell = [tableView makeViewWithIdentifier:CLTimezoneCellIdentifier owner:self]; |
||||
|
||||
CLTimezoneData *dataObject = [CLTimezoneData getCustomObject:self.defaultPreferences[row]]; |
||||
|
||||
NSTextView *customLabel = (NSTextView*)[cell.relativeDate.window |
||||
fieldEditor:YES |
||||
forObject:cell.relativeDate]; |
||||
|
||||
NSNumber *theme = [[NSUserDefaults standardUserDefaults] objectForKey:CLThemeKey]; |
||||
if (theme.integerValue == 1) |
||||
{ |
||||
[cell updateTextColorWithColor:[NSColor whiteColor] andCell:cell]; |
||||
[self.mainTableview setBackgroundColor:[NSColor blackColor]]; |
||||
self.window.alphaValue = 0.90; |
||||
[cell.customName setDrawsBackground:YES]; |
||||
[cell.customName setBackgroundColor:[NSColor blackColor]]; |
||||
customLabel.insertionPointColor = [NSColor whiteColor]; |
||||
} |
||||
else |
||||
{ |
||||
|
||||
[cell updateTextColorWithColor:[NSColor blackColor] andCell:cell]; |
||||
[cell.customName setDrawsBackground:NO]; |
||||
[self.mainTableview setBackgroundColor:[NSColor whiteColor]]; |
||||
self.window.alphaValue = 1; |
||||
customLabel.insertionPointColor = [NSColor blackColor]; |
||||
} |
||||
|
||||
cell.relativeDate.stringValue = [dataObject getDateForTimeZoneWithFutureSliderValue:self.futureSliderValue andDisplayType:CLPanelDisplay]; |
||||
|
||||
cell.time.stringValue = [dataObject getTimeForTimeZoneWithFutureSliderValue:self.futureSliderValue]; |
||||
|
||||
cell.rowNumber = row; |
||||
|
||||
cell.customName.stringValue = [dataObject formatStringShouldContainCity:YES]; |
||||
|
||||
NSNumber *displayFutureSlider = [[NSUserDefaults standardUserDefaults] objectForKey:CLDisplayFutureSliderKey]; |
||||
if ([displayFutureSlider isEqualToNumber:[NSNumber numberWithInteger:1]]) |
||||
{ |
||||
self.futureSlider.hidden = YES; |
||||
} |
||||
else |
||||
{ |
||||
self.futureSlider.hidden = NO; |
||||
} |
||||
|
||||
[cell setUpAutoLayoutWithCell:cell]; |
||||
|
||||
return cell; |
||||
} |
||||
|
||||
#pragma mark - |
||||
#pragma mark NSTableview Drag and Drop |
||||
#pragma mark - |
||||
|
||||
- (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard |
||||
{ |
||||
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes]; |
||||
[pboard declareTypes:[NSArray arrayWithObject:CLDragSessionKey] owner:self]; |
||||
[pboard setData:data forType:CLDragSessionKey]; |
||||
return YES; |
||||
} |
||||
|
||||
|
||||
-(void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row |
||||
{ |
||||
if ([object isKindOfClass:[NSString class]]) |
||||
{ |
||||
CLTimezoneData *dataObject = self.defaultPreferences[row]; |
||||
|
||||
if ([dataObject.formattedAddress isEqualToString:object]) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
dataObject.customLabel = object; |
||||
[self.defaultPreferences replaceObjectAtIndex:row withObject:dataObject]; |
||||
[[NSUserDefaults standardUserDefaults] setObject:self.defaultPreferences forKey:CLDefaultPreferenceKey]; |
||||
[self.mainTableview reloadData]; |
||||
} |
||||
} |
||||
|
||||
|
||||
-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation |
||||
{ |
||||
|
||||
if (row == self.defaultPreferences.count) |
||||
{ |
||||
row -= 1; |
||||
} |
||||
|
||||
NSPasteboard *pBoard = [info draggingPasteboard]; |
||||
|
||||
NSData *data = [pBoard dataForType:CLDragSessionKey]; |
||||
|
||||
NSIndexSet *rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:data]; |
||||
|
||||
[self.defaultPreferences exchangeObjectAtIndex:rowIndexes.firstIndex |
||||
withObjectAtIndex:row]; |
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject:self.defaultPreferences |
||||
forKey:CLDefaultPreferenceKey]; |
||||
|
||||
|
||||
[[NSApplication sharedApplication].windows enumerateObjectsUsingBlock:^(NSWindow * _Nonnull window, NSUInteger idx, BOOL * _Nonnull stop) { |
||||
if ([window.windowController isMemberOfClass:[CLOneWindowController class]]) { |
||||
CLOneWindowController *ref = (CLOneWindowController *) window.windowController; |
||||
[ref.preferencesView refereshTimezoneTableView]; |
||||
} |
||||
|
||||
}]; |
||||
|
||||
[self.mainTableview reloadData]; |
||||
|
||||
return YES; |
||||
} |
||||
|
||||
-(NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id<NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation |
||||
{ |
||||
return NSDragOperationEvery; |
||||
} |
||||
|
||||
- (void) updateDefaultPreferences |
||||
{ |
||||
[super updateDefaultPreferences]; |
||||
|
||||
NSRect frame = [self.window frame]; |
||||
frame.size = NSMakeSize(self.window.frame.size.width, self.scrollViewHeight.constant+10); |
||||
[self.window setFrame: frame display: YES animate:YES]; |
||||
|
||||
[self.window setContentMaxSize:NSMakeSize(self.window.frame.size.width+50, self.scrollViewHeight.constant+100)]; |
||||
|
||||
[self updateTime]; |
||||
} |
||||
|
||||
- (void)updateTime |
||||
{ |
||||
[self.mainTableview reloadData]; |
||||
} |
||||
|
||||
- (IBAction)sliderMoved:(id)sender |
||||
{ |
||||
NSCalendar *currentCalendar = [NSCalendar autoupdatingCurrentCalendar]; |
||||
NSDate *newDate = [currentCalendar dateByAddingUnit:NSCalendarUnitMinute |
||||
value:self.futureSliderValue |
||||
toDate:[NSDate date] |
||||
options:kNilOptions]; |
||||
|
||||
self.dateFormatter.dateStyle = kCFDateFormatterNoStyle; |
||||
self.dateFormatter.timeStyle = kCFDateFormatterShortStyle; |
||||
|
||||
NSString *relativeDate = [currentCalendar isDateInToday:newDate] ? @"Today" : @"Tomorrow"; |
||||
|
||||
NSString *helper = [self.dateFormatter stringFromDate:newDate]; |
||||
|
||||
NSHelpManager *helpManager = [NSHelpManager sharedHelpManager]; |
||||
|
||||
NSPoint pointInScreen = [NSEvent mouseLocation]; |
||||
pointInScreen.y -= 5; |
||||
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ %@", relativeDate, helper]]; |
||||
[NSHelpManager setContextHelpModeActive:YES]; |
||||
[helpManager setContextHelp:attributedString forObject:self.futureSlider]; |
||||
[helpManager showContextHelpForObject:self.futureSlider locationHint:pointInScreen]; |
||||
|
||||
[self.mainTableview reloadData]; |
||||
} |
||||
|
||||
- (void)removeContextHelpForSlider |
||||
{ |
||||
NSEvent *newEvent = [NSEvent mouseEventWithType:NSLeftMouseDown |
||||
location:self.window.mouseLocationOutsideOfEventStream |
||||
modifierFlags:0 |
||||
timestamp:0 |
||||
windowNumber:self.window.windowNumber |
||||
context:self.window.graphicsContext |
||||
eventNumber:0 |
||||
clickCount:1 |
||||
pressure:0]; |
||||
[NSApp postEvent:newEvent atStart:NO]; |
||||
newEvent = [NSEvent mouseEventWithType:NSLeftMouseUp |
||||
location:self.window.mouseLocationOutsideOfEventStream |
||||
modifierFlags:0 |
||||
timestamp:0 |
||||
windowNumber:self.window.windowNumber |
||||
context:self.window.graphicsContext |
||||
eventNumber:0 |
||||
clickCount:1 |
||||
pressure:0]; |
||||
|
||||
[NSApp postEvent:newEvent atStart:NO]; |
||||
} |
||||
|
||||
- (void)updatePanelColor |
||||
{ |
||||
[super updatePanelColor]; |
||||
|
||||
NSPanel *panel = (id)[self window]; |
||||
[panel setAcceptsMouseMovedEvents:YES]; |
||||
[panel setLevel:NSPopUpMenuWindowLevel]; |
||||
[panel setOpaque:NO]; |
||||
|
||||
|
||||
NSNumber *theme = [[NSUserDefaults standardUserDefaults] objectForKey:CLThemeKey]; |
||||
|
||||
if (theme.integerValue == 1) |
||||
{ |
||||
self.shutdownButton.image = [NSImage imageNamed:@"PowerIcon-White"]; |
||||
self.preferencesButton.image = [NSImage imageNamed:@"Settings-White"]; |
||||
self.window.backgroundColor = [NSColor blackColor]; |
||||
[panel setBackgroundColor:[NSColor blackColor]]; |
||||
} |
||||
else |
||||
{ |
||||
self.shutdownButton.image = [NSImage imageNamed:@"PowerIcon"]; |
||||
self.preferencesButton.image = [NSImage imageNamed:NSImageNameActionTemplate]; |
||||
self.window.backgroundColor = [NSColor whiteColor]; |
||||
[panel setBackgroundColor:[NSColor whiteColor]]; |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
@end |
Loading…
Reference in new issue