1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
// Copyright (c) 2012 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.
#include "chrome/browser/ui/cocoa/tab_contents/sad_tab_view_cocoa.h"
#include "base/logging.h"
#include "base/strings/sys_string_conversions.h"
#include "chrome/browser/ui/cocoa/tab_contents/sad_tab_controller.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "grit/theme_resources.h"
#import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTweaker.h"
#import "ui/base/cocoa/controls/hyperlink_text_view.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h"
// Offset above vertical middle of page where contents of page start.
static const CGFloat kSadTabOffset = -64;
// Padding between icon and title.
static const CGFloat kIconTitleSpacing = 20;
// Padding between title and message.
static const CGFloat kTitleMessageSpacing = 15;
// Padding between message and link.
static const CGFloat kMessageLinkSpacing = 15;
// Paddings on left and right of page.
static const CGFloat kTabHorzMargin = 13;
@interface SadTabTextView : NSTextField
- (id)initWithView:(SadTabView*)view withText:(int)textIds;
@end
@implementation SadTabTextView
- (id)initWithView:(SadTabView*)view withText:(int)textIds {
if (self = [super init]) {
[self setTextColor:[NSColor whiteColor]];
[self setAlignment:NSCenterTextAlignment];
[self setStringValue:l10n_util::GetNSString(textIds)];
[self setEditable:NO];
[self setBezeled:NO];
[self setAutoresizingMask:
NSViewMinXMargin|NSViewWidthSizable|NSViewMaxXMargin|NSViewMinYMargin];
[view addSubview:self];
}
return self;
}
- (BOOL)isOpaque {
return YES;
}
@end
@implementation SadTabView
- (void)awakeFromNib {
// Load resource for image and set it.
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
NSImage* image = rb.GetNativeImageNamed(IDR_SAD_TAB).ToNSImage();
[image_ setImage:image];
// Initialize background color.
NSColor* backgroundColor = [[NSColor colorWithCalibratedRed:(35.0f/255.0f)
green:(48.0f/255.0f)
blue:(64.0f/255.0f)
alpha:1.0] retain];
backgroundColor_.reset(backgroundColor);
// Set up the title.
title_.reset([[SadTabTextView alloc]
initWithView:self withText:IDS_SAD_TAB_TITLE]);
[title_ setFont:[NSFont boldSystemFontOfSize:[NSFont systemFontSize]]];
[title_ setBackgroundColor:backgroundColor];
// Set up the message.
message_.reset([[SadTabTextView alloc]
initWithView:self withText:IDS_SAD_TAB_MESSAGE]);
[message_ setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
[message_ setBackgroundColor:backgroundColor];
DCHECK(controller_);
[self initializeHelpText];
}
- (void)drawRect:(NSRect)dirtyRect {
// Paint background.
[backgroundColor_ set];
NSRectFill(dirtyRect);
}
- (void)resizeSubviewsWithOldSize:(NSSize)oldSize {
NSRect newBounds = [self bounds];
CGFloat maxWidth = NSWidth(newBounds) - (kTabHorzMargin * 2);
BOOL callSizeToFit = (messageSize_.width == 0);
// Set new frame origin for image.
NSRect iconFrame = [image_ frame];
CGFloat iconX = floorf((maxWidth - NSWidth(iconFrame)) / 2);
CGFloat iconY =
MIN(floorf((NSHeight(newBounds) - NSHeight(iconFrame)) / 2) -
kSadTabOffset,
NSHeight(newBounds) - NSHeight(iconFrame));
iconX = floorf(iconX);
iconY = floorf(iconY);
[image_ setFrameOrigin:NSMakePoint(iconX, iconY)];
// Set new frame origin for title.
if (callSizeToFit)
[title_ sizeToFit];
NSRect titleFrame = [title_ frame];
CGFloat titleX = floorf((maxWidth - NSWidth(titleFrame)) / 2);
CGFloat titleY = iconY - kIconTitleSpacing - NSHeight(titleFrame);
[title_ setFrameOrigin:NSMakePoint(titleX, titleY)];
// Set new frame for message, wrapping or unwrapping the text if necessary.
if (callSizeToFit) {
[message_ sizeToFit];
messageSize_ = [message_ frame].size;
}
NSRect messageFrame = [message_ frame];
if (messageSize_.width > maxWidth) { // Need to wrap message.
[message_ setFrameSize:NSMakeSize(maxWidth, messageSize_.height)];
CGFloat heightChange =
[GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:message_];
messageFrame.size.width = maxWidth;
messageFrame.size.height = messageSize_.height + heightChange;
messageFrame.origin.x = kTabHorzMargin;
} else {
if (!callSizeToFit) {
[message_ sizeToFit];
messageFrame = [message_ frame];
}
messageFrame.origin.x = floorf((maxWidth - NSWidth(messageFrame)) / 2);
}
messageFrame.origin.y =
titleY - kTitleMessageSpacing - NSHeight(messageFrame);
[message_ setFrame:messageFrame];
// Set new frame for help text and link.
if (help_) {
if (callSizeToFit)
[help_ sizeToFit];
CGFloat helpHeight = [help_ frame].size.height;
[help_ setFrameSize:NSMakeSize(maxWidth, helpHeight)];
// Set new frame origin for link.
NSRect helpFrame = [help_ frame];
CGFloat helpX = floorf((maxWidth - NSWidth(helpFrame)) / 2);
CGFloat helpY =
NSMinY(messageFrame) - kMessageLinkSpacing - NSHeight(helpFrame);
[help_ setFrameOrigin:NSMakePoint(helpX, helpY)];
}
}
- (void)removeHelpText {
if (help_) {
[help_ removeFromSuperview];
help_.reset(nil);
}
}
- (void)initializeHelpText {
// Programmatically create the help link. Note that the frame's initial
// height must be set for the programmatic resizing to work.
help_.reset(
[[HyperlinkTextView alloc] initWithFrame:NSMakeRect(0, 0, 1, 17)]);
[help_ setAutoresizingMask:
NSViewMinXMargin|NSViewWidthSizable|NSViewMaxXMargin|NSViewMinYMargin];
[self addSubview:help_];
[help_ setDelegate:self];
// Get the help text and link.
size_t linkOffset = 0;
NSString* helpMessage(base::SysUTF16ToNSString(l10n_util::GetStringFUTF16(
IDS_SAD_TAB_HELP_MESSAGE, base::string16(), &linkOffset)));
NSString* helpLink = l10n_util::GetNSString(IDS_SAD_TAB_HELP_LINK);
NSFont* font = [NSFont systemFontOfSize:[NSFont smallSystemFontSize]];
[help_ setMessageAndLink:helpMessage
withLink:helpLink
atOffset:linkOffset
font:font
messageColor:[NSColor whiteColor]
linkColor:[NSColor whiteColor]];
[help_ setAlignment:NSCenterTextAlignment];
}
// Called when someone clicks on the embedded link.
- (BOOL)textView:(NSTextView*)textView
clickedOnLink:(id)link
atIndex:(NSUInteger)charIndex {
if (controller_)
[controller_ openLearnMoreAboutCrashLink:nil];
return YES;
}
@end
|