diff options
Diffstat (limited to 'chrome/browser/ui/cocoa/cookie_details_view_controller.mm')
-rw-r--r-- | chrome/browser/ui/cocoa/cookie_details_view_controller.mm | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/cookie_details_view_controller.mm b/chrome/browser/ui/cocoa/cookie_details_view_controller.mm new file mode 100644 index 0000000..9f47a54 --- /dev/null +++ b/chrome/browser/ui/cocoa/cookie_details_view_controller.mm @@ -0,0 +1,110 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "chrome/browser/ui/cocoa/cookie_details_view_controller.h" + +#include "app/l10n_util_mac.h" +#include "app/resource_bundle.h" +#import "base/mac_util.h" +#include "base/sys_string_conversions.h" +#import "chrome/browser/ui/cocoa/cookie_tree_node.h" +#import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" + +namespace { +static const int kExtraMarginBelowWhenExpirationEditable = 5; +} + +#pragma mark View Controller + +@implementation CookieDetailsViewController +@dynamic hasExpiration; + +- (id)init { + return [super initWithNibName:@"CookieDetailsView" + bundle:mac_util::MainAppBundle()]; +} + +- (void)awakeFromNib { + DCHECK(objectController_); +} + +// Finds and returns the y offset of the lowest-most non-hidden +// text field in the view. This is used to shrink the view +// appropriately so that it just fits its visible content. +- (void)getLowestLabelVerticalPosition:(NSView*)view + lowestLabelPosition:(float&)lowestLabelPosition { + if (![view isHidden]) { + if ([view isKindOfClass:[NSTextField class]]) { + NSRect frame = [view frame]; + if (frame.origin.y < lowestLabelPosition) { + lowestLabelPosition = frame.origin.y; + } + } + for (NSView* subview in [view subviews]) { + [self getLowestLabelVerticalPosition:subview + lowestLabelPosition:lowestLabelPosition]; + } + } +} + +- (void)setContentObject:(id)content { + // Make sure the view is loaded before we set the content object, + // otherwise, the KVO notifications to update the content don't + // reach the view and all of the detail values are default + // strings. + NSView* view = [self view]; + + [objectController_ setValue:content forKey:@"content"]; + + // View needs to be re-tweaked after setting the content object, + // since the expiration date may have changed, changing the + // size of the expiration popup. + [tweaker_ tweakUI:view]; +} + +- (void)shrinkViewToFit { + // Adjust the information pane to be exactly the right size + // to hold the visible text information fields. + NSView* view = [self view]; + NSRect frame = [view frame]; + float lowestLabelPosition = frame.origin.y + frame.size.height; + [self getLowestLabelVerticalPosition:view + lowestLabelPosition:lowestLabelPosition]; + float verticalDelta = lowestLabelPosition - frame.origin.y; + + // Popup menu for the expiration is taller than the plain + // text, give it some more room. + if ([[[objectController_ content] details] canEditExpiration]) { + verticalDelta -= kExtraMarginBelowWhenExpirationEditable; + } + + frame.origin.y += verticalDelta; + frame.size.height -= verticalDelta; + [[self view] setFrame:frame]; +} + +- (void)configureBindingsForTreeController:(NSTreeController*)treeController { + // There seems to be a bug in the binding logic that it's not possible + // to bind to the selection of the tree controller, the bind seems to + // require an additional path segment in the key, thus the use of + // selection.self rather than just selection below. + [objectController_ bind:@"contentObject" + toObject:treeController + withKeyPath:@"selection.self" + options:nil]; +} + +- (IBAction)setCookieDoesntHaveExplicitExpiration:(id)sender { + [[[objectController_ content] details] setHasExpiration:NO]; +} + +- (IBAction)setCookieHasExplicitExpiration:(id)sender { + [[[objectController_ content] details] setHasExpiration:YES]; +} + +- (BOOL)hasExpiration { + return [[[objectController_ content] details] hasExpiration]; +} + +@end |