diff options
author | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-06 00:57:40 +0000 |
---|---|---|
committer | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-06 00:57:40 +0000 |
commit | de1509c9e4b7322ef13b754acd4f500916b2e0f7 (patch) | |
tree | f35e47690f4ce382a18fa2e47493dfce8a6c0870 /chrome/browser/cocoa/find_bar_text_field_cell.mm | |
parent | 189cf275c82afe58c656066cc4137ce9e95ece48 (diff) | |
download | chromium_src-de1509c9e4b7322ef13b754acd4f500916b2e0f7.zip chromium_src-de1509c9e4b7322ef13b754acd4f500916b2e0f7.tar.gz chromium_src-de1509c9e4b7322ef13b754acd4f500916b2e0f7.tar.bz2 |
[Mac] Draw the results label correctly in the findbar.
Adds common base classes (StyledTextField and StyledTextFieldCell) for both the find bar and omnibox text fields.
BUG=http://crbug.com/19550
TEST=Findbar results label should not be overdrawn by find text.
TEST=Autocomplete drawing (keyword, hint, lock icon) should not be affected.
Review URL: http://codereview.chromium.org/319005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31186 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/find_bar_text_field_cell.mm')
-rw-r--r-- | chrome/browser/cocoa/find_bar_text_field_cell.mm | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/find_bar_text_field_cell.mm b/chrome/browser/cocoa/find_bar_text_field_cell.mm new file mode 100644 index 0000000..9b52c5f --- /dev/null +++ b/chrome/browser/cocoa/find_bar_text_field_cell.mm @@ -0,0 +1,109 @@ +// 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<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::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 |