Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(389)

Unified Diff: chrome/browser/ui/cocoa/autofill/autofill_popup_base_view_cocoa.mm

Issue 267183002: Password manager: Implement password generation UI for Mac. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address isherman's comments. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/autofill/autofill_popup_base_view_cocoa.mm
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_popup_base_view_cocoa.mm b/chrome/browser/ui/cocoa/autofill/autofill_popup_base_view_cocoa.mm
new file mode 100644
index 0000000000000000000000000000000000000000..3d95e5e3082ffcfbdea126a6ae8b8469ebc1996c
--- /dev/null
+++ b/chrome/browser/ui/cocoa/autofill/autofill_popup_base_view_cocoa.mm
@@ -0,0 +1,167 @@
+// Copyright 2014 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/autofill/autofill_popup_base_view_cocoa.h"
+
+#include "chrome/browser/ui/autofill/autofill_popup_view_delegate.h"
+#include "chrome/browser/ui/autofill/popup_constants.h"
+#include "ui/base/cocoa/window_size_constants.h"
+
+@implementation AutofillPopupBaseViewCocoa
+
+#pragma mark -
+#pragma mark Colors
+
+- (NSColor*)backgroundColor {
+ return [NSColor whiteColor];
+}
+
+- (NSColor*)borderColor {
+ return [NSColor colorForControlTint:[NSColor currentControlTint]];
+}
+
+- (NSColor*)highlightColor {
+ return [NSColor selectedControlColor];
+}
+
+- (NSColor*)nameColor {
+ return [NSColor blackColor];
+}
+
+- (NSColor*)separatorColor {
+ return [NSColor colorWithCalibratedWhite:220 / 255.0 alpha:1];
+}
+
+- (NSColor*)subtextColor {
+ return [NSColor grayColor];
+}
+
+- (NSColor*)warningColor {
+ return [NSColor grayColor];
+}
+
+#pragma mark -
+#pragma mark Public methods
+
+- (id)initWithDelegate:(autofill::AutofillPopupViewDelegate*)delegate
+ frame:(NSRect)frame {
+ self = [super initWithFrame:frame];
+ if (self)
+ delegate_ = delegate;
+
+ return self;
+}
+
+- (void)drawSeparatorWithBounds:(NSRect)bounds {
+ [[self separatorColor] set];
+ [NSBezierPath fillRect:bounds];
+}
+
+// A slight optimization for drawing:
+// https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaViewsGuide/Optimizing/Optimizing.html
+- (BOOL)isOpaque {
+ return YES;
+}
+
+- (BOOL)isFlipped {
+ // Flipped so that it's easier to share controller logic with other OSes.
+ return YES;
+}
+
+- (void)drawBackgroundAndBorder {
+ // The inset is needed since the border is centered on the |path|.
+ // TODO(isherman): We should consider using asset-based drawing for the
+ // border, creating simple bitmaps for the view's border and background, and
+ // drawing them using NSDrawNinePartImage().
+ CGFloat inset = autofill::kPopupBorderThickness / 2.0;
+ NSRect borderRect = NSInsetRect([self bounds], inset, inset);
+ NSBezierPath* path = [NSBezierPath bezierPathWithRect:borderRect];
+ [[self backgroundColor] setFill];
+ [path fill];
+ [path setLineWidth:autofill::kPopupBorderThickness];
+ [[self borderColor] setStroke];
+ [path stroke];
+}
+
+- (void)mouseUp:(NSEvent*)theEvent {
+ // If the view is in the process of being destroyed, abort.
+ if (!delegate_)
+ return;
Ilya Sherman 2014/05/12 21:46:10 This code is currently unreachable. I think that'
Patrick Dubroy 2014/05/13 12:18:05 Ok, I've added back controllerDestroyed.
+
+ NSPoint location = [self convertPoint:[theEvent locationInWindow]
+ fromView:nil];
+
+ if (NSPointInRect(location, [self bounds])) {
+ delegate_->SetSelectionAtPoint(gfx::Point(NSPointToCGPoint(location)));
+ delegate_->AcceptSelectedLine();
+ }
+}
+
+- (void)mouseMoved:(NSEvent*)theEvent {
+ // If the view is in the process of being destroyed, abort.
+ if (!delegate_)
+ return;
+
+ NSPoint location = [self convertPoint:[theEvent locationInWindow]
+ fromView:nil];
+
+ delegate_->SetSelectionAtPoint(gfx::Point(NSPointToCGPoint(location)));
+}
+
+- (void)mouseDragged:(NSEvent*)theEvent {
+ [self mouseMoved:theEvent];
+}
+
+- (void)mouseExited:(NSEvent*)theEvent {
+ // If the view is in the process of being destroyed, abort.
+ if (!delegate_)
+ return;
+
+ delegate_->SelectionCleared();
+}
+
+#pragma mark -
+#pragma mark Messages from AutofillPopupViewBridge:
+
+- (void)updateBoundsAndRedrawPopup {
+ NSRect frame = NSRectFromCGRect(delegate_->popup_bounds().ToCGRect());
+
+ // Flip coordinates back into Cocoa-land. The controller's platform-neutral
+ // coordinate space places the origin at the top-left of the first screen,
+ // whereas Cocoa's coordinate space expects the origin to be at the
+ // bottom-left of this same screen.
+ NSScreen* screen = [[NSScreen screens] objectAtIndex:0];
+ frame.origin.y = NSMaxY([screen frame]) - NSMaxY(frame);
+
+ // TODO(isherman): The view should support scrolling if the popup gets too
+ // big to fit on the screen.
+ [[self window] setFrame:frame display:YES];
+ [self setNeedsDisplay:YES];
+}
+
+- (void)showPopup {
+ NSWindow* window =
+ [[NSWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater
+ styleMask:NSBorderlessWindowMask
+ backing:NSBackingStoreBuffered
+ defer:YES];
+ [window setContentView:self];
+
+ // Telling Cocoa that the window is opaque enables some drawing optimizations.
+ [window setOpaque:YES];
+
+ [self updateBoundsAndRedrawPopup];
+ [[delegate_->container_view() window] addChildWindow:window
+ ordered:NSWindowAbove];
+}
+
+- (void)hidePopup {
+ // Remove the child window before closing, otherwise it can mess up
+ // display ordering.
+ NSWindow* window = [self window];
+ [[window parentWindow] removeChildWindow:window];
+ [window close];
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698