// 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/cocoa/find_bar_text_field_cell.h" #include "app/l10n_util.h" #include "base/logging.h" #include "base/string_util.h" #include "base/sys_string_conversions.h" #include "grit/generated_resources.h" namespace { const CGFloat kBaselineAdjust = 1.0; // 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)baselineAdjust { return kBaselineAdjust; } // @synthesize doesn't seem to compile for this transition. - (NSAttributedString*)resultsString { return resultsString_.get(); } // 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 { scoped_nsobject 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::SysWideToNSString(l10n_util::GetStringF(IDS_FIND_IN_PAGE_COUNT, IntToWString(current), IntToWString(total))); resultsString_.reset([[NSAttributedString alloc] initWithString:results attributes:[self resultsAttributes:(total > 0)]]); } - (void)clearResults { resultsString_.reset(nil); } - (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