| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" | 5 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/strings/sys_string_conversions.h" | 10 #include "base/strings/sys_string_conversions.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 // Separator alpha value. | 39 // Separator alpha value. |
| 40 const CGFloat kSeparatorAlphaValue = 0.6f; | 40 const CGFloat kSeparatorAlphaValue = 0.6f; |
| 41 | 41 |
| 42 // Separator height. | 42 // Separator height. |
| 43 const CGFloat kSeparatorHeight = 1.0f; | 43 const CGFloat kSeparatorHeight = 1.0f; |
| 44 | 44 |
| 45 } // namespace | 45 } // namespace |
| 46 | 46 |
| 47 class ChooserContentViewController : public ChooserController::View { | 47 class ChooserContentViewController : public ChooserController::View { |
| 48 public: | 48 public: |
| 49 ChooserContentViewController(ChooserController* chooser_controller, | 49 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, |
| 50 ChooserController* chooser_controller, |
| 50 NSTableView* table_view, | 51 NSTableView* table_view, |
| 51 SpinnerView* spinner, | 52 SpinnerView* spinner, |
| 52 NSTextField* status, | 53 NSTextField* status, |
| 53 NSButton* rescan_button); | 54 NSButton* rescan_button); |
| 54 ~ChooserContentViewController() override; | 55 ~ChooserContentViewController() override; |
| 55 | 56 |
| 56 // ChooserController::View: | 57 // ChooserController::View: |
| 57 void OnOptionsInitialized() override; | 58 void OnOptionsInitialized() override; |
| 58 void OnOptionAdded(size_t index) override; | 59 void OnOptionAdded(size_t index) override; |
| 59 void OnOptionRemoved(size_t index) override; | 60 void OnOptionRemoved(size_t index) override; |
| 60 void OnAdapterEnabledChanged(bool enabled) override; | 61 void OnAdapterEnabledChanged(bool enabled) override; |
| 61 void OnRefreshStateChanged(bool refreshing) override; | 62 void OnRefreshStateChanged(bool refreshing) override; |
| 62 | 63 |
| 63 void UpdateTableView(); | 64 void UpdateTableView(); |
| 64 | 65 |
| 65 private: | 66 private: |
| 67 ChooserContentViewCocoa* chooser_content_view_; |
| 66 ChooserController* chooser_controller_; | 68 ChooserController* chooser_controller_; |
| 67 NSTableView* table_view_; | 69 NSTableView* table_view_; |
| 68 SpinnerView* spinner_; | 70 SpinnerView* spinner_; |
| 69 NSTextField* status_; | 71 NSTextField* status_; |
| 70 NSButton* rescan_button_; | 72 NSButton* rescan_button_; |
| 71 | 73 |
| 72 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); | 74 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); |
| 73 }; | 75 }; |
| 74 | 76 |
| 75 ChooserContentViewController::ChooserContentViewController( | 77 ChooserContentViewController::ChooserContentViewController( |
| 78 ChooserContentViewCocoa* chooser_content_view, |
| 76 ChooserController* chooser_controller, | 79 ChooserController* chooser_controller, |
| 77 NSTableView* table_view, | 80 NSTableView* table_view, |
| 78 SpinnerView* spinner, | 81 SpinnerView* spinner, |
| 79 NSTextField* status, | 82 NSTextField* status, |
| 80 NSButton* rescan_button) | 83 NSButton* rescan_button) |
| 81 : chooser_controller_(chooser_controller), | 84 : chooser_content_view_(chooser_content_view), |
| 85 chooser_controller_(chooser_controller), |
| 82 table_view_(table_view), | 86 table_view_(table_view), |
| 83 spinner_(spinner), | 87 spinner_(spinner), |
| 84 status_(status), | 88 status_(status), |
| 85 rescan_button_(rescan_button) { | 89 rescan_button_(rescan_button) { |
| 86 DCHECK(chooser_controller_); | 90 DCHECK(chooser_controller_); |
| 87 DCHECK(table_view_); | 91 DCHECK(table_view_); |
| 88 DCHECK(spinner_); | 92 DCHECK(spinner_); |
| 89 DCHECK(status_); | 93 DCHECK(status_); |
| 90 DCHECK(rescan_button_); | 94 DCHECK(rescan_button_); |
| 91 chooser_controller_->set_view(this); | 95 chooser_controller_->set_view(this); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 // of a previously selected row. | 133 // of a previously selected row. |
| 130 [table_view_ deselectAll:nil]; | 134 [table_view_ deselectAll:nil]; |
| 131 UpdateTableView(); | 135 UpdateTableView(); |
| 132 [table_view_ setHidden:NO]; | 136 [table_view_ setHidden:NO]; |
| 133 | 137 |
| 134 [spinner_ setHidden:YES]; | 138 [spinner_ setHidden:YES]; |
| 135 | 139 |
| 136 [status_ setHidden:YES]; | 140 [status_ setHidden:YES]; |
| 137 // When adapter is enabled, show |rescan_button_|; otherwise hide it. | 141 // When adapter is enabled, show |rescan_button_|; otherwise hide it. |
| 138 [rescan_button_ setHidden:enabled ? NO : YES]; | 142 [rescan_button_ setHidden:enabled ? NO : YES]; |
| 143 |
| 144 [chooser_content_view_ updateView]; |
| 139 } | 145 } |
| 140 | 146 |
| 141 void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) { | 147 void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) { |
| 142 if (refreshing) { | 148 if (refreshing) { |
| 143 // No row is selected since the chooser is refreshing. | 149 // No row is selected since the chooser is refreshing. |
| 144 // This will also disable the OK button if it was enabled because | 150 // This will also disable the OK button if it was enabled because |
| 145 // of a previously selected row. | 151 // of a previously selected row. |
| 146 [table_view_ deselectAll:nil]; | 152 [table_view_ deselectAll:nil]; |
| 147 UpdateTableView(); | 153 UpdateTableView(); |
| 148 } | 154 } |
| 149 | 155 |
| 150 // When refreshing and no option available yet, hide |table_view_| and show | 156 // When refreshing and no option available yet, hide |table_view_| and show |
| 151 // |spinner_|. Otherwise show |table_view_| and hide |spinner_|. | 157 // |spinner_|. Otherwise show |table_view_| and hide |spinner_|. |
| 152 bool table_view_hidden = | 158 bool table_view_hidden = |
| 153 refreshing && (chooser_controller_->NumOptions() == 0); | 159 refreshing && (chooser_controller_->NumOptions() == 0); |
| 154 [table_view_ setHidden:table_view_hidden ? YES : NO]; | 160 [table_view_ setHidden:table_view_hidden ? YES : NO]; |
| 155 [spinner_ setHidden:table_view_hidden ? NO : YES]; | 161 [spinner_ setHidden:table_view_hidden ? NO : YES]; |
| 156 | 162 |
| 157 // When refreshing, show |status_| and hide |rescan_button_|. | 163 // When refreshing, show |status_| and hide |rescan_button_|. |
| 158 // When complete, show |rescan_button_| and hide |status_|. | 164 // When complete, show |rescan_button_| and hide |status_|. |
| 159 [status_ setHidden:refreshing ? NO : YES]; | 165 [status_ setHidden:refreshing ? NO : YES]; |
| 160 [rescan_button_ setHidden:refreshing ? YES : NO]; | 166 [rescan_button_ setHidden:refreshing ? YES : NO]; |
| 167 |
| 168 [chooser_content_view_ updateView]; |
| 161 } | 169 } |
| 162 | 170 |
| 163 void ChooserContentViewController::UpdateTableView() { | 171 void ChooserContentViewController::UpdateTableView() { |
| 164 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; | 172 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; |
| 165 [table_view_ reloadData]; | 173 [table_view_ reloadData]; |
| 166 } | 174 } |
| 167 | 175 |
| 168 @implementation ChooserContentViewCocoa | 176 @implementation ChooserContentViewCocoa |
| 169 | 177 |
| 178 // TODO(juncai): restructure this function to be some smaller methods to |
| 179 // create the pieces for the view. By doing so, the methods that calculate |
| 180 // the frame and origins can be moved into those methods, rather than as |
| 181 // helper functions. |
| 170 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle | 182 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle |
| 171 chooserController: | 183 chooserController: |
| 172 (std::unique_ptr<ChooserController>)chooserController { | 184 (std::unique_ptr<ChooserController>)chooserController { |
| 173 // ------------------------------------ | 185 // ------------------------------------ |
| 174 // | Chooser title | | 186 // | Chooser title | |
| 175 // | -------------------------------- | | 187 // | -------------------------------- | |
| 176 // | | option 0 | | | 188 // | | option 0 | | |
| 177 // | | option 1 | | | 189 // | | option 1 | | |
| 178 // | | option 2 | | | 190 // | | option 2 | | |
| 179 // | | | | | 191 // | | | | |
| 180 // | | | | | 192 // | | | | |
| 181 // | | | | | 193 // | | | | |
| 182 // | -------------------------------- | | 194 // | -------------------------------- | |
| 183 // | [ Connect ] [ Cancel ] | | 195 // | [ Connect ] [ Cancel ] | |
| 184 // |----------------------------------| | 196 // |----------------------------------| |
| 185 // | Not seeing your device? Get help | | 197 // | Not seeing your device? Get help | |
| 186 // ------------------------------------ | 198 // ------------------------------------ |
| 187 | 199 |
| 188 // Determine the dimensions of the chooser. | 200 // Determine the dimensions of the chooser. |
| 189 // Once the height and width are set, the buttons and permission menus can | 201 // Once the height and width are set, the buttons and permission menus can |
| 190 // be laid out correctly. | 202 // be laid out correctly. |
| 191 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); | 203 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); |
| 192 | 204 |
| 193 if ((self = [super initWithFrame:chooserFrame])) { | 205 if ((self = [super initWithFrame:chooserFrame])) { |
| 194 chooserController_ = std::move(chooserController); | 206 chooserController_ = std::move(chooserController); |
| 195 | 207 |
| 196 // Create the views. | 208 // Create the views. |
| 197 // Title. | 209 // Title. |
| 198 titleView_ = [self createChooserTitle:chooserTitle]; | 210 titleView_ = [self createChooserTitle:chooserTitle]; |
| 199 CGFloat titleHeight = NSHeight([titleView_ frame]); | 211 titleHeight_ = NSHeight([titleView_ frame]); |
| 200 | 212 |
| 201 // Status. | 213 // Status. |
| 202 status_ = [self createTextField:l10n_util::GetNSString( | 214 status_ = [self createTextField:l10n_util::GetNSString( |
| 203 IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)]; | 215 IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)]; |
| 216 CGFloat statusWidth = kChooserWidth / 2 - kMarginX; |
| 217 // The height is arbitrary as it will be adjusted later. |
| 218 [status_ setFrameSize:NSMakeSize(statusWidth, 0.0f)]; |
| 219 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:status_]; |
| 220 statusHeight_ = NSHeight([status_ frame]); |
| 204 | 221 |
| 205 // Re-scan button. | 222 // Re-scan button. |
| 206 rescanButton_ = | 223 rescanButton_ = |
| 207 [self createHyperlinkButtonWithText: | 224 [self createHyperlinkButtonWithText: |
| 208 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN)]; | 225 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN)]; |
| 226 rescanButtonHeight_ = NSHeight([rescanButton_ frame]); |
| 209 | 227 |
| 210 // Connect button. | 228 // Connect button. |
| 211 connectButton_ = [self createConnectButton]; | 229 connectButton_ = [self createConnectButton]; |
| 212 CGFloat connectButtonWidth = NSWidth([connectButton_ frame]); | 230 connectButtonWidth_ = NSWidth([connectButton_ frame]); |
| 213 CGFloat connectButtonHeight = NSHeight([connectButton_ frame]); | 231 connectButtonHeight_ = NSHeight([connectButton_ frame]); |
| 214 | 232 |
| 215 // Cancel button. | 233 // Cancel button. |
| 216 cancelButton_ = [self createCancelButton]; | 234 cancelButton_ = [self createCancelButton]; |
| 217 CGFloat cancelButtonWidth = NSWidth([cancelButton_ frame]); | 235 cancelButtonWidth_ = NSWidth([cancelButton_ frame]); |
| 236 cancelButtonHeight_ = NSHeight([cancelButton_ frame]); |
| 237 |
| 238 CGFloat buttonRowHeight = |
| 239 std::max(connectButtonHeight_, cancelButtonHeight_); |
| 218 | 240 |
| 219 // Separator. | 241 // Separator. |
| 220 separator_ = [self createSeparator]; | 242 separator_ = [self createSeparator]; |
| 221 | 243 |
| 222 // Message. | 244 // Message. |
| 223 message_ = [self createTextField:l10n_util::GetNSStringF( | 245 message_ = [self createTextField:l10n_util::GetNSStringF( |
| 224 IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, | 246 IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, |
| 225 base::string16())]; | 247 base::string16())]; |
| 226 CGFloat messageWidth = NSWidth([message_ frame]); | 248 CGFloat messageWidth = NSWidth([message_ frame]); |
| 227 CGFloat messageHeight = NSHeight([message_ frame]); | 249 messageHeight_ = NSHeight([message_ frame]); |
| 228 | 250 |
| 229 // Help button. | 251 // Help button. |
| 230 helpButton_ = [self | 252 helpButton_ = [self |
| 231 createHyperlinkButtonWithText: | 253 createHyperlinkButtonWithText: |
| 232 l10n_util::GetNSString(IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT)]; | 254 l10n_util::GetNSString(IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT)]; |
| 233 | 255 |
| 234 // ScollView embedding with TableView. | 256 // ScollView embedding with TableView. |
| 235 CGFloat scrollViewWidth = kChooserWidth - 2 * kMarginX; | 257 noStatusOrRescanButtonShown_.scroll_view_frame = |
| 236 CGFloat scrollViewHeight = kChooserHeight - 2 * kMarginY - | 258 [self calculateScrollViewFrame:buttonRowHeight]; |
| 237 4 * kVerticalPadding - titleHeight - | 259 scrollView_.reset([[NSScrollView alloc] |
| 238 connectButtonHeight - messageHeight; | 260 initWithFrame:noStatusOrRescanButtonShown_.scroll_view_frame]); |
| 239 CGFloat scrollViewOriginX = kMarginX; | |
| 240 CGFloat scrollViewOriginY = | |
| 241 kMarginY + messageHeight + 3 * kVerticalPadding + connectButtonHeight; | |
| 242 NSRect scrollFrame = NSMakeRect(scrollViewOriginX, scrollViewOriginY, | |
| 243 scrollViewWidth, scrollViewHeight); | |
| 244 scrollView_.reset([[NSScrollView alloc] initWithFrame:scrollFrame]); | |
| 245 [scrollView_ setBorderType:NSBezelBorder]; | 261 [scrollView_ setBorderType:NSBezelBorder]; |
| 246 [scrollView_ setHasVerticalScroller:YES]; | 262 [scrollView_ setHasVerticalScroller:YES]; |
| 247 [scrollView_ setHasHorizontalScroller:YES]; | 263 [scrollView_ setHasHorizontalScroller:YES]; |
| 248 [scrollView_ setAutohidesScrollers:YES]; | 264 [scrollView_ setAutohidesScrollers:YES]; |
| 249 | 265 |
| 250 // TableView. | 266 // TableView. |
| 251 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); | 267 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); |
| 252 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); | 268 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); |
| 253 [tableColumn_ setWidth:(scrollViewWidth - kMarginX)]; | 269 [tableColumn_ |
| 270 setWidth:(noStatusOrRescanButtonShown_.scroll_view_frame.size.width - |
| 271 kMarginX)]; |
| 254 [tableView_ addTableColumn:tableColumn_]; | 272 [tableView_ addTableColumn:tableColumn_]; |
| 255 // Make the column title invisible. | 273 // Make the column title invisible. |
| 256 [tableView_ setHeaderView:nil]; | 274 [tableView_ setHeaderView:nil]; |
| 257 [tableView_ setFocusRingType:NSFocusRingTypeNone]; | 275 [tableView_ setFocusRingType:NSFocusRingTypeNone]; |
| 258 | 276 |
| 259 // Spinner. | 277 // Spinner. |
| 260 // Set the spinner in the center of the scroll view. | 278 // Set the spinner in the center of the scroll view. |
| 279 // When |status_| is shown, it may affect the frame origin and size of the |
| 280 // |scrollView_|, and since the |spinner_| is shown with the |status_|, |
| 281 // its frame origin needs to be calculated according to the frame origin |
| 282 // of |scrollView_| with |status_| shown. |
| 283 NSRect scrollViewFrameWithStatusText = [self |
| 284 calculateScrollViewFrame:std::max(statusHeight_, buttonRowHeight)]; |
| 261 CGFloat spinnerOriginX = | 285 CGFloat spinnerOriginX = |
| 262 scrollViewOriginX + (scrollViewWidth - kSpinnerSize) / 2; | 286 scrollViewFrameWithStatusText.origin.x + |
| 287 (scrollViewFrameWithStatusText.size.width - kSpinnerSize) / 2; |
| 263 CGFloat spinnerOriginY = | 288 CGFloat spinnerOriginY = |
| 264 scrollViewOriginY + (scrollViewHeight - kSpinnerSize) / 2; | 289 scrollViewFrameWithStatusText.origin.y + |
| 290 (scrollViewFrameWithStatusText.size.height - kSpinnerSize) / 2; |
| 265 spinner_.reset([[SpinnerView alloc] | 291 spinner_.reset([[SpinnerView alloc] |
| 266 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, | 292 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, |
| 267 kSpinnerSize)]); | 293 kSpinnerSize)]); |
| 268 | 294 |
| 269 // Lay out the views. | 295 // Lay out the views. |
| 270 // Title. | 296 // Title. |
| 271 CGFloat titleOriginX = kMarginX; | 297 CGFloat titleOriginX = kMarginX; |
| 272 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight; | 298 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight_; |
| 273 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; | 299 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; |
| 274 [self addSubview:titleView_]; | 300 [self addSubview:titleView_]; |
| 275 | 301 |
| 276 // ScollView and Spinner. Only one of them is shown. | 302 // ScollView and Spinner. Only one of them is shown. |
| 277 [scrollView_ setDocumentView:tableView_]; | 303 [scrollView_ setDocumentView:tableView_]; |
| 278 [self addSubview:scrollView_]; | 304 [self addSubview:scrollView_]; |
| 279 [spinner_ setHidden:YES]; | 305 [spinner_ setHidden:YES]; |
| 280 [self addSubview:spinner_]; | 306 [self addSubview:spinner_]; |
| 281 | 307 |
| 282 // Status text field and Re-scan button. Only one of them is shown. | 308 // Status text field and Re-scan button. At most one of them is shown. |
| 283 CGFloat statusOriginX = kMarginX; | |
| 284 // Bottom-align with the text on the buttons. | |
| 285 CGFloat statusOriginY = kMarginY + messageHeight + 2 * kVerticalPadding + | |
| 286 (connectButtonHeight - [NSFont systemFontSize]) / 2; | |
| 287 [status_ setFrameOrigin:NSMakePoint(statusOriginX, statusOriginY)]; | |
| 288 [self addSubview:status_]; | 309 [self addSubview:status_]; |
| 289 [status_ setHidden:YES]; | 310 [status_ setHidden:YES]; |
| 290 [rescanButton_ setFrameOrigin:NSMakePoint(statusOriginX, statusOriginY)]; | 311 |
| 291 [rescanButton_ setTarget:self]; | 312 [rescanButton_ setTarget:self]; |
| 292 [rescanButton_ setAction:@selector(onRescan:)]; | 313 [rescanButton_ setAction:@selector(onRescan:)]; |
| 293 [self addSubview:rescanButton_]; | 314 [self addSubview:rescanButton_]; |
| 294 [rescanButton_ setHidden:YES]; | 315 [rescanButton_ setHidden:YES]; |
| 295 | 316 |
| 296 // Connect button. | 317 // Connect button. |
| 297 CGFloat connectButtonOriginX = kChooserWidth - kMarginX - | 318 noStatusOrRescanButtonShown_.connect_button_origin = |
| 298 kHorizontalPadding - connectButtonWidth - | 319 [self calculateConnectButtonOrigin:buttonRowHeight]; |
| 299 cancelButtonWidth; | |
| 300 CGFloat connectButtonOriginY = | |
| 301 kMarginY + messageHeight + 2 * kVerticalPadding; | |
| 302 [connectButton_ | 320 [connectButton_ |
| 303 setFrameOrigin:NSMakePoint(connectButtonOriginX, connectButtonOriginY)]; | 321 setFrameOrigin:noStatusOrRescanButtonShown_.connect_button_origin]; |
| 304 [connectButton_ setEnabled:NO]; | 322 [connectButton_ setEnabled:NO]; |
| 305 [self addSubview:connectButton_]; | 323 [self addSubview:connectButton_]; |
| 306 | 324 |
| 307 // Cancel button. | 325 // Cancel button. |
| 308 CGFloat cancelButtonOriginX = kChooserWidth - kMarginX - cancelButtonWidth; | 326 noStatusOrRescanButtonShown_.cancel_button_origin = |
| 309 CGFloat cancelButtonOriginY = connectButtonOriginY; | 327 [self calculateCancelButtonOrigin:buttonRowHeight]; |
| 310 [cancelButton_ | 328 [cancelButton_ |
| 311 setFrameOrigin:NSMakePoint(cancelButtonOriginX, cancelButtonOriginY)]; | 329 setFrameOrigin:noStatusOrRescanButtonShown_.cancel_button_origin]; |
| 312 [self addSubview:cancelButton_]; | 330 [self addSubview:cancelButton_]; |
| 313 | 331 |
| 314 // Separator. | 332 // Separator. |
| 315 CGFloat separatorOriginX = 0.0f; | 333 CGFloat separatorOriginX = 0.0f; |
| 316 CGFloat separatorOriginY = kMarginY + messageHeight + kVerticalPadding; | 334 CGFloat separatorOriginY = kMarginY + messageHeight_ + kVerticalPadding; |
| 317 [separator_ setFrameOrigin:NSMakePoint(separatorOriginX, separatorOriginY)]; | 335 [separator_ setFrameOrigin:NSMakePoint(separatorOriginX, separatorOriginY)]; |
| 318 [self addSubview:separator_]; | 336 [self addSubview:separator_]; |
| 319 | 337 |
| 320 // Message. | 338 // Message. |
| 321 CGFloat messageOriginX = kMarginX; | 339 CGFloat messageOriginX = kMarginX; |
| 322 CGFloat messageOriginY = kMarginY; | 340 CGFloat messageOriginY = kMarginY; |
| 323 [message_ setFrameOrigin:NSMakePoint(messageOriginX, messageOriginY)]; | 341 [message_ setFrameOrigin:NSMakePoint(messageOriginX, messageOriginY)]; |
| 324 [self addSubview:message_]; | 342 [self addSubview:message_]; |
| 325 | 343 |
| 326 // Help button. | 344 // Help button. |
| 327 CGFloat helpButtonOriginX = | 345 CGFloat helpButtonOriginX = |
| 328 kMarginX + messageWidth - kHorizontalPadding / 2; | 346 kMarginX + messageWidth - kHorizontalPadding / 2; |
| 329 CGFloat helpButtonOriginY = kMarginY; | 347 CGFloat helpButtonOriginY = kMarginY; |
| 330 [helpButton_ | 348 [helpButton_ |
| 331 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; | 349 setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)]; |
| 332 [helpButton_ setTarget:self]; | 350 [helpButton_ setTarget:self]; |
| 333 [helpButton_ setAction:@selector(onHelpPressed:)]; | 351 [helpButton_ setAction:@selector(onHelpPressed:)]; |
| 334 [self addSubview:helpButton_]; | 352 [self addSubview:helpButton_]; |
| 335 | 353 |
| 354 // Calculate and cache the frame and origins values. |
| 355 buttonRowHeight = std::max( |
| 356 statusHeight_, std::max(connectButtonHeight_, cancelButtonHeight_)); |
| 357 statusShown_ = {[self calculateScrollViewFrame:buttonRowHeight], |
| 358 [self calculateConnectButtonOrigin:buttonRowHeight], |
| 359 [self calculateCancelButtonOrigin:buttonRowHeight]}; |
| 360 statusOrigin_ = [self calculateStatusOrigin:buttonRowHeight]; |
| 361 |
| 362 buttonRowHeight = |
| 363 std::max(rescanButtonHeight_, |
| 364 std::max(connectButtonHeight_, cancelButtonHeight_)); |
| 365 rescanButtonShown_ = {[self calculateScrollViewFrame:buttonRowHeight], |
| 366 [self calculateConnectButtonOrigin:buttonRowHeight], |
| 367 [self calculateCancelButtonOrigin:buttonRowHeight]}; |
| 368 rescanButtonOrigin_ = [self calculateRescanButtonOrigin:buttonRowHeight]; |
| 369 |
| 336 chooserContentViewController_.reset(new ChooserContentViewController( | 370 chooserContentViewController_.reset(new ChooserContentViewController( |
| 337 chooserController_.get(), tableView_.get(), spinner_.get(), | 371 self, chooserController_.get(), tableView_.get(), spinner_.get(), |
| 338 status_.get(), rescanButton_.get())); | 372 status_.get(), rescanButton_.get())); |
| 339 } | 373 } |
| 340 | 374 |
| 341 return self; | 375 return self; |
| 342 } | 376 } |
| 343 | 377 |
| 344 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { | 378 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { |
| 345 base::scoped_nsobject<NSTextField> titleView( | 379 base::scoped_nsobject<NSTextField> titleView( |
| 346 [[NSTextField alloc] initWithFrame:NSZeroRect]); | 380 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
| 347 [titleView setDrawsBackground:NO]; | 381 [titleView setDrawsBackground:NO]; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 (NSString*)text { | 437 (NSString*)text { |
| 404 base::scoped_nsobject<NSButton> button( | 438 base::scoped_nsobject<NSButton> button( |
| 405 [[NSButton alloc] initWithFrame:NSZeroRect]); | 439 [[NSButton alloc] initWithFrame:NSZeroRect]); |
| 406 base::scoped_nsobject<HyperlinkButtonCell> cell( | 440 base::scoped_nsobject<HyperlinkButtonCell> cell( |
| 407 [[HyperlinkButtonCell alloc] initTextCell:text]); | 441 [[HyperlinkButtonCell alloc] initTextCell:text]); |
| 408 [button setCell:cell.get()]; | 442 [button setCell:cell.get()]; |
| 409 [button sizeToFit]; | 443 [button sizeToFit]; |
| 410 return button; | 444 return button; |
| 411 } | 445 } |
| 412 | 446 |
| 447 - (NSRect)calculateScrollViewFrame:(CGFloat)buttonRowHeight { |
| 448 CGFloat originX = kMarginX; |
| 449 CGFloat originY = |
| 450 kMarginY + messageHeight_ + 3 * kVerticalPadding + buttonRowHeight; |
| 451 CGFloat width = kChooserWidth - 2 * kMarginX; |
| 452 CGFloat height = kChooserHeight - 2 * kMarginY - 4 * kVerticalPadding - |
| 453 titleHeight_ - buttonRowHeight - messageHeight_; |
| 454 return NSMakeRect(originX, originY, width, height); |
| 455 } |
| 456 |
| 457 - (NSPoint)calculateStatusOrigin:(CGFloat)buttonRowHeight { |
| 458 return NSMakePoint(kMarginX, kMarginY + messageHeight_ + |
| 459 2 * kVerticalPadding + |
| 460 (buttonRowHeight - statusHeight_) / 2); |
| 461 } |
| 462 |
| 463 - (NSPoint)calculateRescanButtonOrigin:(CGFloat)buttonRowHeight { |
| 464 return NSMakePoint(kMarginX, kMarginY + messageHeight_ + |
| 465 2 * kVerticalPadding + |
| 466 (buttonRowHeight - rescanButtonHeight_) / 2); |
| 467 } |
| 468 |
| 469 - (NSPoint)calculateConnectButtonOrigin:(CGFloat)buttonRowHeight { |
| 470 return NSMakePoint(kChooserWidth - kMarginX - kHorizontalPadding - |
| 471 connectButtonWidth_ - cancelButtonWidth_, |
| 472 kMarginY + messageHeight_ + 2 * kVerticalPadding + |
| 473 (buttonRowHeight - connectButtonHeight_) / 2); |
| 474 } |
| 475 |
| 476 - (NSPoint)calculateCancelButtonOrigin:(CGFloat)buttonRowHeight { |
| 477 return NSMakePoint(kChooserWidth - kMarginX - cancelButtonWidth_, |
| 478 kMarginY + messageHeight_ + 2 * kVerticalPadding + |
| 479 (buttonRowHeight - cancelButtonHeight_) / 2); |
| 480 } |
| 481 |
| 482 - (void)updateView { |
| 483 FrameAndOrigin frameAndOrigin; |
| 484 if (![status_ isHidden]) { |
| 485 [status_ setFrameOrigin:statusOrigin_]; |
| 486 frameAndOrigin = statusShown_; |
| 487 } else if (![rescanButton_ isHidden]) { |
| 488 [rescanButton_ setFrameOrigin:rescanButtonOrigin_]; |
| 489 frameAndOrigin = rescanButtonShown_; |
| 490 } else { |
| 491 frameAndOrigin = noStatusOrRescanButtonShown_; |
| 492 } |
| 493 |
| 494 [scrollView_ setFrame:frameAndOrigin.scroll_view_frame]; |
| 495 [connectButton_ setFrameOrigin:frameAndOrigin.connect_button_origin]; |
| 496 [cancelButton_ setFrameOrigin:frameAndOrigin.cancel_button_origin]; |
| 497 } |
| 498 |
| 413 - (NSTableView*)tableView { | 499 - (NSTableView*)tableView { |
| 414 return tableView_.get(); | 500 return tableView_.get(); |
| 415 } | 501 } |
| 416 | 502 |
| 417 - (SpinnerView*)spinner { | 503 - (SpinnerView*)spinner { |
| 418 return spinner_.get(); | 504 return spinner_.get(); |
| 419 } | 505 } |
| 420 | 506 |
| 421 - (NSTextField*)status { | 507 - (NSTextField*)status { |
| 422 return status_.get(); | 508 return status_.get(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 | 564 |
| 479 - (void)onRescan:(id)sender { | 565 - (void)onRescan:(id)sender { |
| 480 chooserController_->RefreshOptions(); | 566 chooserController_->RefreshOptions(); |
| 481 } | 567 } |
| 482 | 568 |
| 483 - (void)onHelpPressed:(id)sender { | 569 - (void)onHelpPressed:(id)sender { |
| 484 chooserController_->OpenHelpCenterUrl(); | 570 chooserController_->OpenHelpCenterUrl(); |
| 485 } | 571 } |
| 486 | 572 |
| 487 @end | 573 @end |
| OLD | NEW |