| // 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 |