| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "chrome/browser/chromeos/frame/browser_view.h" | 5 #include "chrome/browser/chromeos/frame/browser_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 | 115 |
| 116 DISALLOW_COPY_AND_ASSIGN(ChromeosTabStrip); | 116 DISALLOW_COPY_AND_ASSIGN(ChromeosTabStrip); |
| 117 }; | 117 }; |
| 118 */ | 118 */ |
| 119 | 119 |
| 120 } // namespace | 120 } // namespace |
| 121 | 121 |
| 122 namespace chromeos { | 122 namespace chromeos { |
| 123 | 123 |
| 124 // LayoutManager for BrowserView, which layouts extra components such as | 124 // LayoutManager for BrowserView, which layouts extra components such as |
| 125 // main menu, stataus views as follows: | 125 // the status views as follows: |
| 126 // ____ __ __ | 126 // ____ __ __ |
| 127 // [AppLauncher] / \ \ \ [StatusArea] | 127 // / \ \ \ [StatusArea] |
| 128 // | 128 // |
| 129 class BrowserViewLayout : public ::BrowserViewLayout { | 129 class BrowserViewLayout : public ::BrowserViewLayout { |
| 130 public: | 130 public: |
| 131 BrowserViewLayout() : ::BrowserViewLayout() {} | 131 BrowserViewLayout() : ::BrowserViewLayout() {} |
| 132 virtual ~BrowserViewLayout() {} | 132 virtual ~BrowserViewLayout() {} |
| 133 | 133 |
| 134 ////////////////////////////////////////////////////////////////////////////// | 134 ////////////////////////////////////////////////////////////////////////////// |
| 135 // BrowserViewLayout overrides: | 135 // BrowserViewLayout overrides: |
| 136 | 136 |
| 137 void Installed(views::View* host) { | 137 void Installed(views::View* host) { |
| 138 main_menu_button_ = NULL; | |
| 139 compact_navigation_bar_ = NULL; | 138 compact_navigation_bar_ = NULL; |
| 140 status_area_ = NULL; | 139 status_area_ = NULL; |
| 141 spacer_ = NULL; | 140 spacer_ = NULL; |
| 142 ::BrowserViewLayout::Installed(host); | 141 ::BrowserViewLayout::Installed(host); |
| 143 } | 142 } |
| 144 | 143 |
| 145 void ViewAdded(views::View* host, | 144 void ViewAdded(views::View* host, |
| 146 views::View* view) { | 145 views::View* view) { |
| 147 ::BrowserViewLayout::ViewAdded(host, view); | 146 ::BrowserViewLayout::ViewAdded(host, view); |
| 148 switch (view->GetID()) { | 147 switch (view->GetID()) { |
| 149 case VIEW_ID_SPACER: | 148 case VIEW_ID_SPACER: |
| 150 spacer_ = view; | 149 spacer_ = view; |
| 151 break; | 150 break; |
| 152 case VIEW_ID_APP_MENU_BUTTON: | |
| 153 main_menu_button_ = view; | |
| 154 break; | |
| 155 case VIEW_ID_STATUS_AREA: | 151 case VIEW_ID_STATUS_AREA: |
| 156 status_area_ = static_cast<chromeos::StatusAreaView*>(view); | 152 status_area_ = static_cast<chromeos::StatusAreaView*>(view); |
| 157 break; | 153 break; |
| 158 case VIEW_ID_COMPACT_NAV_BAR: | 154 case VIEW_ID_COMPACT_NAV_BAR: |
| 159 compact_navigation_bar_ = view; | 155 compact_navigation_bar_ = view; |
| 160 break; | 156 break; |
| 161 case VIEW_ID_OTR_AVATAR: | 157 case VIEW_ID_OTR_AVATAR: |
| 162 otr_avatar_icon_ = view; | 158 otr_avatar_icon_ = view; |
| 163 break; | 159 break; |
| 164 } | 160 } |
| 165 } | 161 } |
| 166 | 162 |
| 167 // In the normal and the compact navigation bar mode, ChromeOS | 163 // In the normal and the compact navigation bar mode, ChromeOS |
| 168 // layouts compact navigation buttons and status views in the title | 164 // layouts compact navigation buttons and status views in the title |
| 169 // area. See Layout | 165 // area. See Layout |
| 170 virtual int LayoutTabStrip() { | 166 virtual int LayoutTabStrip() { |
| 171 if (browser_view_->IsFullscreen() || | 167 if (browser_view_->IsFullscreen() || |
| 172 !browser_view_->IsTabStripVisible()) { | 168 !browser_view_->IsTabStripVisible()) { |
| 173 main_menu_button_->SetVisible(false); | |
| 174 compact_navigation_bar_->SetVisible(false); | 169 compact_navigation_bar_->SetVisible(false); |
| 175 status_area_->SetVisible(false); | 170 status_area_->SetVisible(false); |
| 176 otr_avatar_icon_->SetVisible(false); | 171 otr_avatar_icon_->SetVisible(false); |
| 177 tabstrip_->SetVisible(false); | 172 tabstrip_->SetVisible(false); |
| 178 tabstrip_->SetBounds(0, 0, 0, 0); | 173 tabstrip_->SetBounds(0, 0, 0, 0); |
| 179 return 0; | 174 return 0; |
| 180 } else { | 175 } else { |
| 181 gfx::Rect layout_bounds = | 176 gfx::Rect layout_bounds = |
| 182 browser_view_->frame()->GetBoundsForTabStrip(tabstrip_); | 177 browser_view_->frame()->GetBoundsForTabStrip(tabstrip_); |
| 183 gfx::Point tabstrip_origin = layout_bounds.origin(); | 178 gfx::Point tabstrip_origin = layout_bounds.origin(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 204 | 199 |
| 205 private: | 200 private: |
| 206 chromeos::BrowserView* chromeos_browser_view() { | 201 chromeos::BrowserView* chromeos_browser_view() { |
| 207 return static_cast<chromeos::BrowserView*>(browser_view_); | 202 return static_cast<chromeos::BrowserView*>(browser_view_); |
| 208 } | 203 } |
| 209 | 204 |
| 210 // Tests if the point is on one of views that are within the | 205 // Tests if the point is on one of views that are within the |
| 211 // considered title bar area of client view. | 206 // considered title bar area of client view. |
| 212 bool IsPointInViewsInTitleArea(const gfx::Point& point) | 207 bool IsPointInViewsInTitleArea(const gfx::Point& point) |
| 213 const { | 208 const { |
| 214 gfx::Point point_in_main_menu_coords(point); | |
| 215 views::View::ConvertPointToView(browser_view_, main_menu_button_, | |
| 216 &point_in_main_menu_coords); | |
| 217 if (main_menu_button_->HitTest(point_in_main_menu_coords)) | |
| 218 return true; | |
| 219 | |
| 220 gfx::Point point_in_status_area_coords(point); | 209 gfx::Point point_in_status_area_coords(point); |
| 221 views::View::ConvertPointToView(browser_view_, status_area_, | 210 views::View::ConvertPointToView(browser_view_, status_area_, |
| 222 &point_in_status_area_coords); | 211 &point_in_status_area_coords); |
| 223 if (status_area_->HitTest(point_in_status_area_coords)) | 212 if (status_area_->HitTest(point_in_status_area_coords)) |
| 224 return true; | 213 return true; |
| 225 | 214 |
| 226 if (compact_navigation_bar_->IsVisible()) { | 215 if (compact_navigation_bar_->IsVisible()) { |
| 227 gfx::Point point_in_cnb_coords(point); | 216 gfx::Point point_in_cnb_coords(point); |
| 228 views::View::ConvertPointToView(browser_view_, | 217 views::View::ConvertPointToView(browser_view_, |
| 229 compact_navigation_bar_, | 218 compact_navigation_bar_, |
| 230 &point_in_cnb_coords); | 219 &point_in_cnb_coords); |
| 231 return compact_navigation_bar_->HitTest(point_in_cnb_coords); | 220 return compact_navigation_bar_->HitTest(point_in_cnb_coords); |
| 232 } | 221 } |
| 233 return false; | 222 return false; |
| 234 } | 223 } |
| 235 | 224 |
| 236 // Layouts components in the title bar area (given by | 225 // Layouts components in the title bar area (given by |
| 237 // |bounds|). These include the main menu, the compact navigation | 226 // |bounds|). These include the main menu, the compact navigation |
| 238 // buttons (in compact navbar mode), the otr avatar icon (in | 227 // buttons (in compact navbar mode), the otr avatar icon (in |
| 239 // incognito window), the tabstrip and the the status area. | 228 // incognito window), the tabstrip and the the status area. |
| 240 int LayoutTitlebarComponents(const gfx::Rect& bounds) { | 229 int LayoutTitlebarComponents(const gfx::Rect& bounds) { |
| 241 if (bounds.IsEmpty()) { | 230 if (bounds.IsEmpty()) { |
| 242 return 0; | 231 return 0; |
| 243 } | 232 } |
| 244 main_menu_button_->SetVisible(true); | |
| 245 compact_navigation_bar_->SetVisible( | 233 compact_navigation_bar_->SetVisible( |
| 246 chromeos_browser_view()->is_compact_style()); | 234 chromeos_browser_view()->is_compact_style()); |
| 247 tabstrip_->SetVisible(true); | 235 tabstrip_->SetVisible(true); |
| 248 otr_avatar_icon_->SetVisible(browser_view_->ShouldShowOffTheRecordAvatar()); | 236 otr_avatar_icon_->SetVisible(browser_view_->ShouldShowOffTheRecordAvatar()); |
| 249 status_area_->SetVisible(true); | 237 status_area_->SetVisible(true); |
| 250 | 238 |
| 251 int bottom = bounds.bottom(); | 239 int bottom = bounds.bottom(); |
| 252 | 240 |
| 253 /* TODO(oshima): | 241 /* TODO(oshima): |
| 254 * Disabling the ability to update location bar on re-layout bacause | 242 * Disabling the ability to update location bar on re-layout bacause |
| 255 * tabstrip state may not be in sync with the browser's state when | 243 * tabstrip state may not be in sync with the browser's state when |
| 256 * new tab is added. We should decide when we know more about this | 244 * new tab is added. We should decide when we know more about this |
| 257 * feature. May be we should simply hide the location? | 245 * feature. May be we should simply hide the location? |
| 258 * Filed a bug: http://crbug.com/30612. | 246 * Filed a bug: http://crbug.com/30612. |
| 259 if (compact_navigation_bar_->IsVisible()) { | 247 if (compact_navigation_bar_->IsVisible()) { |
| 260 // Update the size and location of the compact location bar. | 248 // Update the size and location of the compact location bar. |
| 261 int index = browser_view()->browser()->selected_index(); | 249 int index = browser_view()->browser()->selected_index(); |
| 262 compact_location_bar_host_->Update(index, false, true); | 250 compact_location_bar_host_->Update(index, false, true); |
| 263 } | 251 } |
| 264 */ | 252 */ |
| 265 | 253 |
| 266 // Layout main menu before tab strip. | |
| 267 gfx::Size main_menu_size = main_menu_button_->GetPreferredSize(); | |
| 268 main_menu_button_->SetBounds(0, bounds.y(), | |
| 269 main_menu_size.width(), bounds.height()); | |
| 270 | |
| 271 status_area_->Update(); | 254 status_area_->Update(); |
| 272 // Layout status area after tab strip. | 255 // Layout status area after tab strip. |
| 273 gfx::Size status_size = status_area_->GetPreferredSize(); | 256 gfx::Size status_size = status_area_->GetPreferredSize(); |
| 274 status_area_->SetBounds(bounds.x() + bounds.width() - status_size.width(), | 257 status_area_->SetBounds(bounds.x() + bounds.width() - status_size.width(), |
| 275 bounds.y(), status_size.width(), | 258 bounds.y(), status_size.width(), |
| 276 status_size.height()); | 259 status_size.height()); |
| 277 LayoutOTRAvatar(bounds); | 260 LayoutOTRAvatar(bounds); |
| 278 | 261 |
| 279 int curx = bounds.x() + main_menu_size.width(); | 262 int curx = bounds.x(); |
| 280 | 263 |
| 281 if (compact_navigation_bar_->IsVisible()) { | 264 if (compact_navigation_bar_->IsVisible()) { |
| 282 gfx::Size cnb_size = compact_navigation_bar_->GetPreferredSize(); | 265 gfx::Size cnb_size = compact_navigation_bar_->GetPreferredSize(); |
| 283 // Adjust the size of the compact nativation bar to avoid creating | 266 // Adjust the size of the compact nativation bar to avoid creating |
| 284 // a fixed widget with its own gdk window. AutocompleteEditView | 267 // a fixed widget with its own gdk window. AutocompleteEditView |
| 285 // expects the parent view to be transparent, but a fixed with | 268 // expects the parent view to be transparent, but a fixed with |
| 286 // its own window is not. | 269 // its own window is not. |
| 287 gfx::Rect cnb_bounds(curx, bounds.y(), cnb_size.width(), bounds.height()); | 270 gfx::Rect cnb_bounds(curx, bounds.y(), cnb_size.width(), bounds.height()); |
| 288 compact_navigation_bar_->SetBounds( | 271 compact_navigation_bar_->SetBounds( |
| 289 cnb_bounds.Intersect(browser_view_->GetVisibleBounds())); | 272 cnb_bounds.Intersect(browser_view_->GetVisibleBounds())); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 319 gfx::Size preferred_size = otr_avatar_icon_->GetPreferredSize(); | 302 gfx::Size preferred_size = otr_avatar_icon_->GetPreferredSize(); |
| 320 | 303 |
| 321 int y = bounds.bottom() - preferred_size.height() - kOTRBottomSpacing; | 304 int y = bounds.bottom() - preferred_size.height() - kOTRBottomSpacing; |
| 322 int x = status_bounds.x() - kOTRSideSpacing - preferred_size.width(); | 305 int x = status_bounds.x() - kOTRSideSpacing - preferred_size.width(); |
| 323 otr_avatar_icon_->SetBounds(x, y, preferred_size.width(), | 306 otr_avatar_icon_->SetBounds(x, y, preferred_size.width(), |
| 324 preferred_size.height()); | 307 preferred_size.height()); |
| 325 } | 308 } |
| 326 } | 309 } |
| 327 | 310 |
| 328 | 311 |
| 329 views::View* main_menu_button_; | |
| 330 chromeos::StatusAreaView* status_area_; | 312 chromeos::StatusAreaView* status_area_; |
| 331 views::View* compact_navigation_bar_; | 313 views::View* compact_navigation_bar_; |
| 332 views::View* spacer_; | 314 views::View* spacer_; |
| 333 views::View* otr_avatar_icon_; | 315 views::View* otr_avatar_icon_; |
| 334 | 316 |
| 335 DISALLOW_COPY_AND_ASSIGN(BrowserViewLayout); | 317 DISALLOW_COPY_AND_ASSIGN(BrowserViewLayout); |
| 336 }; | 318 }; |
| 337 | 319 |
| 338 BrowserView::BrowserView(Browser* browser) | 320 BrowserView::BrowserView(Browser* browser) |
| 339 : ::BrowserView(browser), | 321 : ::BrowserView(browser), |
| 340 main_menu_button_(NULL), | |
| 341 status_area_(NULL), | 322 status_area_(NULL), |
| 342 compact_navigation_bar_(NULL), | 323 compact_navigation_bar_(NULL), |
| 343 // Standard style is default. | 324 // Standard style is default. |
| 344 // TODO(oshima): Get this info from preference. | 325 // TODO(oshima): Get this info from preference. |
| 345 ui_style_(StandardStyle), | 326 ui_style_(StandardStyle), |
| 346 force_maximized_window_(false), | 327 force_maximized_window_(false), |
| 347 spacer_(NULL), | 328 spacer_(NULL), |
| 348 otr_avatar_icon_(new views::ImageView()) { | 329 otr_avatar_icon_(new views::ImageView()) { |
| 349 } | 330 } |
| 350 | 331 |
| 351 BrowserView::~BrowserView() { | 332 BrowserView::~BrowserView() { |
| 352 } | 333 } |
| 353 | 334 |
| 354 //////////////////////////////////////////////////////////////////////////////// | 335 //////////////////////////////////////////////////////////////////////////////// |
| 355 // BrowserView, ::BrowserView overrides: | 336 // BrowserView, ::BrowserView overrides: |
| 356 | 337 |
| 357 void BrowserView::Init() { | 338 void BrowserView::Init() { |
| 358 ::BrowserView::Init(); | 339 ::BrowserView::Init(); |
| 359 main_menu_button_ = new views::ImageButton(this); | |
| 360 main_menu_button_->SetID(VIEW_ID_APP_MENU_BUTTON); | |
| 361 ThemeProvider* theme_provider = | 340 ThemeProvider* theme_provider = |
| 362 frame()->GetThemeProviderForFrame(); | 341 frame()->GetThemeProviderForFrame(); |
| 363 SkBitmap* image = theme_provider->GetBitmapNamed(IDR_APP_LAUNCHER_BUTTON); | |
| 364 main_menu_button_->SetImage(views::CustomButton::BS_NORMAL, image); | |
| 365 main_menu_button_->SetImage(views::CustomButton::BS_HOT, image); | |
| 366 main_menu_button_->SetImage(views::CustomButton::BS_PUSHED, image); | |
| 367 AddChildView(main_menu_button_); | |
| 368 | 342 |
| 369 compact_location_bar_host_.reset( | 343 compact_location_bar_host_.reset( |
| 370 new chromeos::CompactLocationBarHost(this)); | 344 new chromeos::CompactLocationBarHost(this)); |
| 371 compact_navigation_bar_ = | 345 compact_navigation_bar_ = |
| 372 new chromeos::CompactNavigationBar(this); | 346 new chromeos::CompactNavigationBar(this); |
| 373 compact_navigation_bar_->SetID(VIEW_ID_COMPACT_NAV_BAR); | 347 compact_navigation_bar_->SetID(VIEW_ID_COMPACT_NAV_BAR); |
| 374 AddChildView(compact_navigation_bar_); | 348 AddChildView(compact_navigation_bar_); |
| 375 compact_navigation_bar_->Init(); | 349 compact_navigation_bar_->Init(); |
| 376 status_area_ = new BrowserStatusAreaView(this); | 350 status_area_ = new BrowserStatusAreaView(this); |
| 377 status_area_->SetID(VIEW_ID_STATUS_AREA); | 351 status_area_->SetID(VIEW_ID_STATUS_AREA); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 | 419 |
| 446 views::LayoutManager* BrowserView::CreateLayoutManager() const { | 420 views::LayoutManager* BrowserView::CreateLayoutManager() const { |
| 447 return new BrowserViewLayout(); | 421 return new BrowserViewLayout(); |
| 448 } | 422 } |
| 449 | 423 |
| 450 void BrowserView::ChildPreferredSizeChanged(View* child) { | 424 void BrowserView::ChildPreferredSizeChanged(View* child) { |
| 451 Layout(); | 425 Layout(); |
| 452 SchedulePaint(); | 426 SchedulePaint(); |
| 453 } | 427 } |
| 454 | 428 |
| 455 // views::ButtonListener overrides. | |
| 456 void BrowserView::ButtonPressed(views::Button* sender, | |
| 457 const views::Event& event) { | |
| 458 gfx::Rect bounds = main_menu_button_->bounds(); | |
| 459 gfx::Point origin = bounds.origin(); | |
| 460 // Move the origin to the right otherwise the app launcher info bubble left | |
| 461 // border will show out of screen. | |
| 462 origin.Offset(kAppLauncherLeftPadding, 0); | |
| 463 views::RootView::ConvertPointToScreen(this, &origin); | |
| 464 bounds.set_origin(origin); | |
| 465 ::AppLauncher::Show(browser(), bounds, gfx::Point(), std::string()); | |
| 466 } | |
| 467 | |
| 468 // views::ContextMenuController overrides. | 429 // views::ContextMenuController overrides. |
| 469 void BrowserView::ShowContextMenu(views::View* source, | 430 void BrowserView::ShowContextMenu(views::View* source, |
| 470 const gfx::Point& p, | 431 const gfx::Point& p, |
| 471 bool is_mouse_gesture) { | 432 bool is_mouse_gesture) { |
| 472 // Only show context menu if point is in unobscured parts of browser, i.e. | 433 // Only show context menu if point is in unobscured parts of browser, i.e. |
| 473 // if NonClientHitTest returns : | 434 // if NonClientHitTest returns : |
| 474 // - HTCAPTION: in title bar or unobscured part of tabstrip | 435 // - HTCAPTION: in title bar or unobscured part of tabstrip |
| 475 // - HTNOWHERE: as the name implies. | 436 // - HTNOWHERE: as the name implies. |
| 476 gfx::Point point_in_parent_coords(p); | 437 gfx::Point point_in_parent_coords(p); |
| 477 views::View::ConvertPointToView(NULL, GetParent(), &point_in_parent_coords); | 438 views::View::ConvertPointToView(NULL, GetParent(), &point_in_parent_coords); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { | 506 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { |
| 546 // Create a browser view for chromeos. | 507 // Create a browser view for chromeos. |
| 547 BrowserView* view; | 508 BrowserView* view; |
| 548 if (browser->type() & Browser::TYPE_POPUP) | 509 if (browser->type() & Browser::TYPE_POPUP) |
| 549 view = new chromeos::PanelBrowserView(browser); | 510 view = new chromeos::PanelBrowserView(browser); |
| 550 else | 511 else |
| 551 view = new chromeos::BrowserView(browser); | 512 view = new chromeos::BrowserView(browser); |
| 552 BrowserFrame::Create(view, browser->profile()); | 513 BrowserFrame::Create(view, browser->profile()); |
| 553 return view; | 514 return view; |
| 554 } | 515 } |
| OLD | NEW |