| Index: chrome/browser/ui/cocoa/website_settings/split_block_button.mm
|
| diff --git a/chrome/browser/ui/cocoa/website_settings/split_block_button.mm b/chrome/browser/ui/cocoa/website_settings/split_block_button.mm
|
| deleted file mode 100644
|
| index ba0939c73f8c3c48009843c474793672995d3fd2..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/website_settings/split_block_button.mm
|
| +++ /dev/null
|
| @@ -1,341 +0,0 @@
|
| -// 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/website_settings/split_block_button.h"
|
| -
|
| -#include <cmath>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/mac/scoped_nsobject.h"
|
| -#include "chrome/grit/generated_resources.h"
|
| -#include "skia/ext/skia_utils_mac.h"
|
| -#import "ui/base/cocoa/menu_controller.h"
|
| -#include "ui/base/l10n/l10n_util_mac.h"
|
| -#include "ui/base/models/simple_menu_model.h"
|
| -
|
| -namespace {
|
| -
|
| -enum MouseLocation {
|
| - kInsideLeftCell,
|
| - kInsideRightCell,
|
| - kNotInside,
|
| -};
|
| -
|
| -enum CornerType {
|
| - kRounded,
|
| - kAngled,
|
| -};
|
| -
|
| -NSBezierPath* PathWithCornerStyles(NSRect frame,
|
| - CornerType leftCornerStyle,
|
| - CornerType rightCornerStyle) {
|
| - base::scoped_nsobject<NSBezierPath> path([[NSBezierPath bezierPath] retain]);
|
| - const CGFloat x0 = NSMinX(frame);
|
| - const CGFloat x1 = NSMaxX(frame);
|
| - const CGFloat y0 = NSMinY(frame);
|
| - const CGFloat y1 = NSMaxY(frame);
|
| - const CGFloat radius = 2;
|
| -
|
| - // Start at the center bottom. Draw left and up, including both left corners.
|
| - [path moveToPoint:NSMakePoint(std::floor((x1 - x0) * .5), y0)];
|
| - if (leftCornerStyle == kAngled) {
|
| - [path lineToPoint:NSMakePoint(x0, y0)];
|
| - [path lineToPoint:NSMakePoint(x0, y1)];
|
| - } else {
|
| - [path appendBezierPathWithArcFromPoint:NSMakePoint(x0, y0)
|
| - toPoint:NSMakePoint(x0, y0 + radius)
|
| - radius:radius];
|
| - [path appendBezierPathWithArcFromPoint:NSMakePoint(x0, y1)
|
| - toPoint:NSMakePoint(x0 + radius, y1)
|
| - radius:radius];
|
| - }
|
| - // Draw through the upper right-hand and lower-right-hand corners.
|
| - if (rightCornerStyle == kAngled) {
|
| - [path lineToPoint:NSMakePoint(x1, y1)];
|
| - [path lineToPoint:NSMakePoint(x1, y0)];
|
| - } else {
|
| - [path appendBezierPathWithArcFromPoint:NSMakePoint(x1, y1)
|
| - toPoint:NSMakePoint(x1, y1 - radius)
|
| - radius:radius];
|
| - [path appendBezierPathWithArcFromPoint:NSMakePoint(x1, y0)
|
| - toPoint:NSMakePoint(x1 - radius, y0)
|
| - radius:radius];
|
| - }
|
| - return path.autorelease();
|
| -}
|
| -
|
| -void DrawBezel(id<ConstrainedWindowButtonDrawableCell>cell,
|
| - CornerType leftCorners,
|
| - CornerType rightCorners,
|
| - NSRect frame,
|
| - NSView* view) {
|
| - if ([cell isMouseInside]) {
|
| - base::scoped_nsobject<NSBezierPath> path(
|
| - [PathWithCornerStyles(frame, leftCorners, rightCorners) retain]);
|
| - [ConstrainedWindowButton DrawBackgroundAndShadowForPath:path
|
| - withCell:cell
|
| - inView:view];
|
| - [ConstrainedWindowButton DrawInnerHighlightForPath:path
|
| - withCell:cell
|
| - inView:view];
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// A button cell used by SplitBlockButton, containing the title.
|
| -@interface SplitButtonTitleCell : ConstrainedWindowButtonCell
|
| -- (NSRect)rect;
|
| -@end
|
| -
|
| -// A button cell used by SplitBlockButton, containing the popup menu.
|
| -@interface SplitButtonPopUpCell :
|
| - NSPopUpButtonCell<ConstrainedWindowButtonDrawableCell> {
|
| - @private
|
| - BOOL isMouseInside_;
|
| - base::scoped_nsobject<MenuController> menuController_;
|
| - std::unique_ptr<ui::SimpleMenuModel> menuModel_;
|
| -}
|
| -
|
| -// Designated initializer.
|
| -- (id)initWithMenuDelegate:(ui::SimpleMenuModel::Delegate*)menuDelegate;
|
| -
|
| -- (NSRect)rect;
|
| -
|
| -@end
|
| -
|
| -@implementation SplitBlockButton
|
| -
|
| -- (id)initWithMenuDelegate:(ui::SimpleMenuModel::Delegate*)menuDelegate {
|
| - if (self = [super initWithFrame:NSZeroRect]) {
|
| - leftCell_.reset([[SplitButtonTitleCell alloc] init]);
|
| - rightCell_.reset([[SplitButtonPopUpCell alloc]
|
| - initWithMenuDelegate:menuDelegate]);
|
| - [leftCell_ setTitle:l10n_util::GetNSString(IDS_PERMISSION_DENY)];
|
| - [leftCell_ setEnabled:YES];
|
| - [rightCell_ setEnabled:YES];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -+ (Class)cellClass {
|
| - return nil;
|
| -}
|
| -
|
| -- (NSString*)title {
|
| - return [leftCell_ title];
|
| -}
|
| -
|
| -- (void)setAction:(SEL)action {
|
| - [leftCell_ setAction:action];
|
| -}
|
| -
|
| -- (void)setTarget:(id)target {
|
| - [leftCell_ setTarget:target];
|
| -}
|
| -
|
| -- (void)drawRect:(NSRect)rect {
|
| - // Copy the base class: inset to leave room for the shadow.
|
| - --rect.size.height;
|
| -
|
| - // This function assumes that |rect| is always the same as [self frame].
|
| - // If that changes, the drawing functions will need to be adjusted.
|
| - const CGFloat radius = 2;
|
| - NSBezierPath* path = [NSBezierPath bezierPathWithRoundedRect:rect
|
| - xRadius:radius
|
| - yRadius:radius];
|
| - [ConstrainedWindowButton DrawBackgroundAndShadowForPath:path
|
| - withCell:nil
|
| - inView:self];
|
| -
|
| - // Use intersection rects for the cell drawing, to ensure the height
|
| - // adjustment is honored.
|
| - [leftCell_ setControlView:self];
|
| - [leftCell_ drawWithFrame:NSIntersectionRect(rect, [self leftCellRect])
|
| - inView:self];
|
| -
|
| - [rightCell_ setControlView:self];
|
| - [rightCell_ drawWithFrame:NSIntersectionRect(rect, [self rightCellRect])
|
| - inView:self];
|
| -
|
| - // Draw the border.
|
| - path = [NSBezierPath bezierPathWithRoundedRect:NSInsetRect(rect, 0.5, 0.5)
|
| - xRadius:radius
|
| - yRadius:radius];
|
| - [ConstrainedWindowButton DrawBorderForPath:path
|
| - withCell:nil
|
| - inView:self];
|
| -}
|
| -
|
| -- (void)updateTrackingAreas {
|
| - [self updateTrackingArea:&leftTrackingArea_
|
| - forCell:leftCell_
|
| - withRect:[self leftCellRect]];
|
| -
|
| - [self updateTrackingArea:&rightTrackingArea_
|
| - forCell:rightCell_
|
| - withRect:[self rightCellRect]];
|
| -}
|
| -
|
| -- (void)updateTrackingArea:(ui::ScopedCrTrackingArea*)trackingArea
|
| - forCell:(id<ConstrainedWindowButtonDrawableCell>)cell
|
| - withRect:(NSRect)rect {
|
| - DCHECK(trackingArea);
|
| - NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited |
|
| - NSTrackingActiveInActiveApp;
|
| - [self removeTrackingArea:trackingArea->get()];
|
| - trackingArea->reset([[CrTrackingArea alloc] initWithRect:rect
|
| - options:options
|
| - owner:self
|
| - userInfo:nil]);
|
| - [self addTrackingArea:trackingArea->get()];
|
| -}
|
| -
|
| -- (void)mouseEntered:(NSEvent*)theEvent {
|
| - [self mouseMoved:theEvent];
|
| -}
|
| -
|
| -- (void)mouseExited:(NSEvent*)theEvent {
|
| - [self mouseMoved:theEvent];
|
| -}
|
| -
|
| -- (void)mouseMoved:(NSEvent*)theEvent {
|
| - MouseLocation location = [self mouseLocationForEvent:theEvent];
|
| - [rightCell_ setIsMouseInside:NO];
|
| - [leftCell_ setIsMouseInside:NO];
|
| - if (location == kInsideLeftCell)
|
| - [leftCell_ setIsMouseInside:YES];
|
| - else if (location == kInsideRightCell)
|
| - [rightCell_ setIsMouseInside:YES];
|
| - [self setNeedsDisplay:YES];
|
| -}
|
| -
|
| -- (void)mouseDown:(NSEvent*)theEvent {
|
| - MouseLocation downLocation = [self mouseLocationForEvent:theEvent];
|
| - NSCell* focusCell = nil;
|
| - NSRect rect;
|
| - if (downLocation == kInsideLeftCell) {
|
| - focusCell = leftCell_.get();
|
| - rect = [self leftCellRect];
|
| - } else if (downLocation == kInsideRightCell) {
|
| - focusCell = rightCell_.get();
|
| - rect = [self rightCellRect];
|
| - }
|
| -
|
| - do {
|
| - MouseLocation location = [self mouseLocationForEvent:theEvent];
|
| - if (location != kNotInside) {
|
| - [focusCell setHighlighted:YES];
|
| - [self setNeedsDisplay:YES];
|
| -
|
| - if ([focusCell trackMouse:theEvent
|
| - inRect:rect
|
| - ofView:self
|
| - untilMouseUp:NO]) {
|
| - [focusCell setState:![focusCell state]];
|
| - [self setNeedsDisplay:YES];
|
| - break;
|
| - } else {
|
| - // The above -trackMouse call returned NO, so we know that
|
| - // the mouse left the cell before a mouse up event occurred.
|
| - [focusCell setHighlighted:NO];
|
| - [self setNeedsDisplay:YES];
|
| - }
|
| - }
|
| - const NSUInteger mask = NSLeftMouseUpMask | NSLeftMouseDraggedMask;
|
| - theEvent = [[self window] nextEventMatchingMask:mask];
|
| - } while ([theEvent type] != NSLeftMouseUp);
|
| -}
|
| -
|
| -- (MouseLocation)mouseLocationForEvent:(NSEvent*)theEvent {
|
| - MouseLocation location = kNotInside;
|
| - NSPoint mousePoint = [self convertPoint:[theEvent locationInWindow]
|
| - fromView:nil];
|
| - if ([self mouse:mousePoint inRect:[leftCell_ rect]])
|
| - location = kInsideLeftCell;
|
| - else if ([self mouse:mousePoint inRect:[self rightCellRect]])
|
| - location = kInsideRightCell;
|
| - return location;
|
| -}
|
| -
|
| -- (void)sizeToFit {
|
| - NSSize leftSize = [leftCell_ cellSize];
|
| - NSSize rightSize = [rightCell_ cellSize];
|
| - NSSize size = NSMakeSize(
|
| - std::ceil(std::max(leftSize.width + rightSize.width,
|
| - constrained_window_button::kButtonMinWidth)),
|
| - std::ceil(std::max(leftSize.height, rightSize.height)));
|
| - [self setFrameSize:size];
|
| -}
|
| -
|
| -- (NSRect)leftCellRect {
|
| - return [leftCell_ rect];
|
| -}
|
| -
|
| -- (NSRect)rightCellRect {
|
| - NSRect leftFrame, rightFrame;
|
| - NSDivideRect([self bounds], &leftFrame, &rightFrame,
|
| - NSWidth([self leftCellRect]), NSMinXEdge);
|
| - return rightFrame;
|
| -}
|
| -
|
| -// Accessor for Testing.
|
| -- (NSMenu*)menu {
|
| - return [rightCell_ menu];
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation SplitButtonTitleCell
|
| -
|
| -- (void)drawBezelWithFrame:(NSRect)frame inView:(NSView *)controlView {
|
| - DrawBezel(self, kRounded, kAngled, frame, controlView);
|
| -}
|
| -
|
| -- (NSRect)rect {
|
| - NSSize size = [self cellSize];
|
| - return NSMakeRect(0, 0, std::ceil(size.width), std::ceil(size.height));
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation SplitButtonPopUpCell
|
| -
|
| -@synthesize isMouseInside = isMouseInside_;
|
| -
|
| -- (id)initWithMenuDelegate:(ui::SimpleMenuModel::Delegate*)menuDelegate {
|
| - if (self = [super initTextCell:@"" pullsDown:YES]) {
|
| - [self setControlSize:NSSmallControlSize];
|
| - [self setArrowPosition:NSPopUpArrowAtCenter];
|
| - [self setBordered:NO];
|
| - [self setBackgroundColor:[NSColor clearColor]];
|
| - menuModel_.reset(new ui::SimpleMenuModel(menuDelegate));
|
| - menuModel_->AddItemWithStringId(0, IDS_PERMISSION_CUSTOMIZE);
|
| - menuController_.reset(
|
| - [[MenuController alloc] initWithModel:menuModel_.get()
|
| - useWithPopUpButtonCell:NO]);
|
| - [self setMenu:[menuController_ menu]];
|
| - [self setUsesItemFromMenu:NO];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)drawBorderAndBackgroundWithFrame:(NSRect)frame
|
| - inView:(NSView*)controlView {
|
| - // The arrow, which is what should be drawn by the base class, is drawn
|
| - // during -drawBezelWithFrame. The only way to draw our own border with
|
| - // the default arrow is to make the cell unbordered, and draw the border
|
| - // from -drawBorderAndBackgroundWithFrame, rather than simply overriding
|
| - // -drawBezelWithFrame.
|
| - DrawBezel(self, kAngled, kRounded, frame, controlView);
|
| - [super drawBorderAndBackgroundWithFrame:NSOffsetRect(frame, -4, 0)
|
| - inView:controlView];
|
| -}
|
| -
|
| -- (NSRect)rect {
|
| - NSSize size = [self cellSize];
|
| - return NSMakeRect(0, 0, std::ceil(size.width), std::ceil(size.height));
|
| -}
|
| -
|
| -@end
|
|
|