diff options
Diffstat (limited to 'chrome/browser/ui/cocoa/speech_input_window_controller.mm')
-rw-r--r-- | chrome/browser/ui/cocoa/speech_input_window_controller.mm | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/chrome/browser/ui/cocoa/speech_input_window_controller.mm b/chrome/browser/ui/cocoa/speech_input_window_controller.mm index 5ab5db0..105e84c 100644 --- a/chrome/browser/ui/cocoa/speech_input_window_controller.mm +++ b/chrome/browser/ui/cocoa/speech_input_window_controller.mm @@ -18,6 +18,7 @@ const int kBubbleControlVerticalSpacing = 10; // Space between controls. const int kBubbleHorizontalMargin = 5; // Space on either sides of controls. +const int kInstructionLabelMaxWidth = 150; @interface SpeechInputWindowController (Private) - (NSSize)calculateContentSize; @@ -35,33 +36,13 @@ const int kBubbleHorizontalMargin = 5; // Space on either sides of controls. anchoredAt:anchoredAt])) { DCHECK(delegate); delegate_ = delegate; - - [self showWindow:nil]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; - - NSWindow* window = [self window]; [[self bubble] setArrowLocation:info_bubble::kTopLeft]; - NSImage* icon = ResourceBundle::GetSharedInstance().GetNativeImageNamed( - IDR_SPEECH_INPUT_MIC_EMPTY); - [iconImage_ setImage:icon]; - - NSSize newSize = [self calculateContentSize]; - [[self bubble] setFrameSize:newSize]; - NSSize windowDelta = NSMakeSize( - newSize.width - NSWidth([[window contentView] bounds]), - newSize.height - NSHeight([[window contentView] bounds])); - windowDelta = [[window contentView] convertSize:windowDelta toView:nil]; - NSRect newFrame = [window frame]; - newFrame.size.width += windowDelta.width; - newFrame.size.height += windowDelta.height; - [window setFrame:newFrame display:NO]; - - [self layout:newSize]; // Layout all the child controls. } - (IBAction)cancel:(id)sender { @@ -87,25 +68,32 @@ const int kBubbleHorizontalMargin = 5; // Space on either sides of controls. NSSize cancelSize = [cancelButton_ bounds].size; NSSize tryAgainSize = [tryAgainButton_ bounds].size; CGFloat newHeight = cancelSize.height + kBubbleControlVerticalSpacing; - CGFloat newWidth = cancelSize.width + tryAgainSize.width; + CGFloat newWidth = cancelSize.width; + if (![tryAgainButton_ isHidden]) + newWidth += tryAgainSize.width; if (![iconImage_ isHidden]) { NSSize size = [[iconImage_ image] size]; newHeight += size.height; - newWidth = std::max(newWidth, size.width); + newWidth = std::max(newWidth, size.width + 2 * kBubbleHorizontalMargin); } if (![instructionLabel_ isHidden]) { - [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField: - instructionLabel_]; - NSSize size = [instructionLabel_ bounds].size; - newHeight += size.height + kBubbleControlVerticalSpacing; - newWidth = std::max(newWidth, size.width); + [instructionLabel_ sizeToFit]; + NSSize textSize = [[instructionLabel_ cell] cellSize]; + NSRect boundsRect = NSMakeRect(0, 0, kInstructionLabelMaxWidth, + CGFLOAT_MAX); + NSSize multiLineSize = + [[instructionLabel_ cell] cellSizeForBounds:boundsRect]; + if (textSize.width > multiLineSize.width) + textSize = multiLineSize; + newHeight += textSize.height + kBubbleControlVerticalSpacing; + newWidth = std::max(newWidth, textSize.width); } if (![micSettingsButton_ isHidden]) { NSSize size = [micSettingsButton_ bounds].size; - newHeight += size.height + kBubbleControlVerticalSpacing; + newHeight += size.height; newWidth = std::max(newWidth, size.width); } @@ -144,11 +132,16 @@ const int kBubbleHorizontalMargin = 5; // Space on either sides of controls. } if (![instructionLabel_ isHidden]) { - rect = [instructionLabel_ bounds]; - rect.origin.x = (size.width - NSWidth(rect)) / 2; - rect.origin.y = y; + int spaceForIcon = 0; + if (![iconImage_ isHidden]) { + spaceForIcon = [[iconImage_ image] size].height + + kBubbleControlVerticalSpacing; + } + + rect = NSMakeRect(0, y, size.width, size.height - y - spaceForIcon - + kBubbleControlVerticalSpacing * 2); [instructionLabel_ setFrame:rect]; - y += rect.size.height + kBubbleControlVerticalSpacing; + y = size.height - spaceForIcon - kBubbleControlVerticalSpacing; } if (![iconImage_ isHidden]) { @@ -157,11 +150,15 @@ const int kBubbleHorizontalMargin = 5; // Space on either sides of controls. rect.origin.y = y; [iconImage_ setFrame:rect]; } - } - (void)updateLayout:(SpeechInputBubbleBase::DisplayMode)mode messageText:(const string16&)messageText { + // The very first time this method is called, the child views would still be + // uninitialized and null. So we invoke [self window] first and that sets up + // the child views properly so we can do the layout calculations below. + NSWindow* window = [self window]; + // Get the right set of controls to be visible. if (mode == SpeechInputBubbleBase::DISPLAY_MODE_MESSAGE) { [instructionLabel_ setStringValue:base::SysUTF16ToNSString(messageText)]; @@ -187,11 +184,15 @@ const int kBubbleHorizontalMargin = 5; // Space on either sides of controls. } NSSize newSize = [self calculateContentSize]; - NSRect rect = [[self bubble] frame]; - rect.origin.y -= newSize.height - rect.size.height; - rect.size = newSize; - [[self bubble] setFrame:rect]; - [self layout:newSize]; + [[self bubble] setFrameSize:newSize]; + + NSSize windowDelta = [[window contentView] convertSize:newSize toView:nil]; + NSRect newFrame = [window frame]; + newFrame.origin.y -= windowDelta.height - newFrame.size.height; + newFrame.size = windowDelta; + [window setFrame:newFrame display:YES]; + + [self layout:newSize]; // Layout all the child controls. } - (void)windowWillClose:(NSNotification*)notification { |