blob: 82b0bf045ebd211917cf099dfdce60a29df98dc0 [file] [log] [blame]
// Copyright (c) 2009 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/find_bar/find_bar_text_field_cell.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
namespace {
// How far to offset the keyword token into the field.
const NSInteger kResultsXOffset = 3;
// How much width (beyond text) to add to the keyword token on each
// side.
const NSInteger kResultsTokenInset = 3;
// How far to shift bounding box of hint down from top of field.
// Assumes -setFlipped:YES.
const NSInteger kResultsYOffset = 4;
// How far the editor insets itself, for purposes of determining if
// decorations need to be trimmed.
const CGFloat kEditorHorizontalInset = 3.0;
// Conveniences to centralize width+offset calculations.
CGFloat WidthForResults(NSAttributedString* resultsString) {
return kResultsXOffset + ceil([resultsString size].width) +
2 * kResultsTokenInset;
}
} // namespace
@implementation FindBarTextFieldCell
- (CGFloat)topTextFrameOffset {
return 1.0;
}
- (CGFloat)bottomTextFrameOffset {
return 1.0;
}
- (CGFloat)cornerRadius {
return 4.0;
}
- (rect_path_utils::RoundedCornerFlags)roundedCornerFlags {
return rect_path_utils::RoundedCornerLeft;
}
// Convenience for the attributes used in the right-justified info
// cells. Sets the background color to red if |foundMatches| is YES.
- (NSDictionary*)resultsAttributes:(BOOL)foundMatches {
base::scoped_nsobject<NSMutableParagraphStyle> style(
[[NSMutableParagraphStyle alloc] init]);
[style setAlignment:NSRightTextAlignment];
return [NSDictionary dictionaryWithObjectsAndKeys:
[self font], NSFontAttributeName,
[NSColor lightGrayColor], NSForegroundColorAttributeName,
[NSColor whiteColor], NSBackgroundColorAttributeName,
style.get(), NSParagraphStyleAttributeName,
nil];
}
- (void)setActiveMatch:(NSInteger)current of:(NSInteger)total {
NSString* results =
base::SysUTF16ToNSString(l10n_util::GetStringFUTF16(
IDS_FIND_IN_PAGE_COUNT,
base::IntToString16(current),
base::IntToString16(total)));
resultsString_.reset([[NSAttributedString alloc]
initWithString:results
attributes:[self resultsAttributes:(total > 0)]]);
}
- (void)clearResults {
resultsString_.reset(nil);
}
- (NSString*)resultsString {
return [resultsString_ string];
}
- (NSRect)textFrameForFrame:(NSRect)cellFrame {
NSRect textFrame([super textFrameForFrame:cellFrame]);
if (resultsString_)
textFrame.size.width -= WidthForResults(resultsString_);
return textFrame;
}
// Do not show the I-beam cursor over the results label.
- (NSRect)textCursorFrameForFrame:(NSRect)cellFrame {
return [self textFrameForFrame:cellFrame];
}
- (void)drawResultsWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
DCHECK(resultsString_);
NSRect textFrame = [self textFrameForFrame:cellFrame];
NSRect infoFrame(NSMakeRect(NSMaxX(textFrame),
cellFrame.origin.y + kResultsYOffset,
ceil([resultsString_ size].width),
cellFrame.size.height - kResultsYOffset));
[resultsString_.get() drawInRect:infoFrame];
}
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
if (resultsString_)
[self drawResultsWithFrame:cellFrame inView:controlView];
[super drawInteriorWithFrame:cellFrame inView:controlView];
}
@end