Index: chrome/browser/ui/cocoa/intents/web_intent_view_controller_progress.mm |
diff --git a/chrome/browser/ui/cocoa/intents/web_intent_view_controller_progress.mm b/chrome/browser/ui/cocoa/intents/web_intent_view_controller_progress.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4c75eba5013fc930746bbcf16985a7ca0550be7c |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/intents/web_intent_view_controller_progress.mm |
@@ -0,0 +1,136 @@ |
+// 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. |
+ |
+#import "chrome/browser/ui/cocoa/intents/web_intent_view_controller_progress.h" |
+ |
+#include "base/memory/scoped_nsobject.h" |
+#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_control_utils.h" |
+#import "chrome/browser/ui/cocoa/flipped_view.h" |
+#import "chrome/browser/ui/cocoa/spinner_progress_indicator.h" |
+#import "chrome/browser/ui/constrained_window.h" |
+#include "grit/theme_resources.h" |
+#include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" |
+#include "ui/base/resource/resource_bundle.h" |
+ |
+namespace { |
+ |
+// Vertical space between the progress indicator and the message text field. |
+const CGFloat kProgressMessageFieldSpacing = 15.0; |
+ |
+// Joins the two strings with a space between them. |
+NSAttributedString* JoinString(NSAttributedString* string1, |
+ NSAttributedString* string2) { |
+ if (![string1 length]) |
+ return scoped_nsobject<NSAttributedString>([string2 retain]); |
Robert Sesek
2012/10/03 19:11:44
This returns a strong reference while the |result|
sail
2012/10/10 02:00:10
Done.
Oops, fixed.
|
+ if (![string2 length]) |
+ return scoped_nsobject<NSAttributedString>([string1 retain]); |
+ |
+ NSMutableAttributedString* result = |
+ [[[NSMutableAttributedString alloc] init] autorelease]; |
+ [result appendAttributedString:string1]; |
+ scoped_nsobject<NSAttributedString> space( |
+ [[NSAttributedString alloc] initWithString:@" "]); |
+ [result appendAttributedString:space]; |
+ [result appendAttributedString:string2]; |
Nico
2012/10/02 03:47:25
ugh!
(I don't know a shorter way to do this eithe
|
+ return result; |
+} |
+ |
+} // namespace |
+ |
+@interface WebIntentViewControllerProgress () |
+// Updates the message text field and resizes it to fit the given width. |
+- (void)updateTextFieldAndResizeToWidth:(CGFloat)width; |
+@end |
+ |
+@implementation WebIntentViewControllerProgress |
+ |
+- (id)init { |
+ if ((self = [super init])) { |
+ scoped_nsobject<NSView> view( |
+ [[FlippedView alloc] initWithFrame:NSZeroRect]); |
+ [self setView:view]; |
+ |
+ messageTextField_.reset([constrained_window::CreateLabel() retain]); |
+ [[self view] addSubview:messageTextField_]; |
+ |
+ progressIndicator_.reset( |
+ [[SpinnerProgressIndicator alloc] initWithFrame:NSZeroRect]); |
+ [progressIndicator_ sizeToFit]; |
+ [[self view] addSubview:progressIndicator_]; |
+ } |
+ return self; |
+} |
+ |
+- (SpinnerProgressIndicator*)progressIndicator { |
+ return progressIndicator_; |
+} |
+ |
+- (void)setTitle:(NSString*)title { |
+ title_.reset([title retain]); |
+} |
+ |
+- (void)setMessage:(NSString*)message { |
+ message_.reset([message retain]); |
+} |
+ |
+- (void)setPercentDone:(int)percent { |
+ if (percent == -1) { |
+ [progressIndicator_ setIsIndeterminate:YES]; |
+ } else { |
+ [progressIndicator_ setIsIndeterminate:NO]; |
+ [progressIndicator_ setPercentDone:percent]; |
+ } |
+} |
+ |
+- (NSSize)minimumSizeForInnerWidth:(CGFloat)innerWidth { |
+ NSSize progressSize = [progressIndicator_ frame].size; |
+ CGFloat width = std::max(innerWidth, progressSize.width); |
+ |
+ [self updateTextFieldAndResizeToWidth:width]; |
+ CGFloat height = progressSize.height + NSHeight([messageTextField_ frame]) + |
+ kProgressMessageFieldSpacing; |
+ return NSMakeSize(width, height); |
+} |
+ |
+- (void)layoutWithInnerFrame:(NSRect)innerFrame { |
+ [self updateTextFieldAndResizeToWidth:NSWidth(innerFrame)]; |
+ |
+ NSRect progressFrame = [progressIndicator_ frame]; |
+ progressFrame.origin.x = NSMidX(innerFrame) - NSWidth(progressFrame) / 2.0; |
+ progressFrame.origin.y = NSMinY(innerFrame) + |
+ NSHeight(innerFrame) / 3.0 - NSHeight(progressFrame) / 2.0; |
+ |
+ NSRect textFrame = [messageTextField_ frame]; |
+ CGFloat newHeight = NSMaxY(progressFrame) + NSHeight(textFrame) + |
+ kProgressMessageFieldSpacing; |
+ if (newHeight > NSHeight(innerFrame)) |
+ progressFrame.origin.y = NSMinY(innerFrame); |
+ [progressIndicator_ setFrame:progressFrame]; |
+ |
+ textFrame.origin.x = NSMinX(innerFrame); |
+ textFrame.origin.y = NSMaxY(progressFrame) + kProgressMessageFieldSpacing; |
+ [messageTextField_ setFrame:textFrame]; |
+} |
+ |
+- (void)updateTextFieldAndResizeToWidth:(CGFloat)width { |
+ NSAttributedString* title = constrained_window::GetAttributedLabelString( |
+ title_, |
+ ConstrainedWindow::kBoldTextFontStyle, |
+ NSCenterTextAlignment, |
+ NSLineBreakByWordWrapping); |
+ NSAttributedString* message = constrained_window::GetAttributedLabelString( |
+ message_, |
+ ConstrainedWindow::kTextFontStyle, |
+ NSCenterTextAlignment, |
+ NSLineBreakByWordWrapping); |
+ [messageTextField_ setAttributedStringValue:JoinString(title, message)]; |
+ |
+ NSRect frame = NSZeroRect; |
+ frame.size.width = width; |
+ [messageTextField_ setFrame:frame]; |
+ [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField: |
+ messageTextField_]; |
+} |
+ |
+@end |