172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/status/window_switcher_button.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/status/status_area_host.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/wm_ipc.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser_window.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "grit/generated_resources.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "grit/theme_resources.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace chromeos { 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenint GetNormalBrowserCount() { 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int count = 0; 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserList::const_iterator iter; 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (iter = BrowserList::begin(); iter != BrowserList::end(); ++iter) { 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if ((*iter)->type() == Browser::TYPE_NORMAL) 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen count++; 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return count; 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenWindowSwitcherButton::WindowSwitcherButton(StatusAreaHost* host) 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : StatusAreaButton(host, this) { 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WINDOW_SWITCHER)); 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetEnabled(true); 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UpdateStatus(); 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserList::AddObserver(this); 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenWindowSwitcherButton::~WindowSwitcherButton() { 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserList::RemoveObserver(this); 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid WindowSwitcherButton::UpdateStatus() { 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (GetNormalBrowserCount() < 2) { 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // There are less than two browsers. This means we can't switch 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // anywhere, so we disappear. 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetTooltipText(L""); 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetVisible(false); 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PreferredSizeChanged(); 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetTooltipText(UTF16ToWide(l10n_util::GetStringUTF16( 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDS_STATUSBAR_WINDOW_SWITCHER_TOOLTIP))); 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // There are at least two browsers, so we show ourselves. 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetVisible(true); 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PreferredSizeChanged(); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// WindowSwitcherButton, views::ViewMenuDelegate implementation: 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid WindowSwitcherButton::RunMenu(views::View* source, const gfx::Point& pt) { 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Don't do anything if there aren't at least two normal browsers to 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // switch between. 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (GetNormalBrowserCount() < 2) 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Send a message to the ChromeOS window manager to switch to the 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // next top level browser window. Only the window manager knows 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // what order they are in, so we can't use Chrome's browser list 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to decide. 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WmIpc::Message message(chromeos::WM_IPC_MESSAGE_WM_CYCLE_WINDOWS); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen message.set_param(0, true); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WmIpc::instance()->SendMessage(message); 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// BrowserList::Observer implementation: 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Called immediately after a browser is added to the list 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid WindowSwitcherButton::OnBrowserAdded(const Browser* browser) { 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UpdateStatus(); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Called immediately after a browser is removed from the list 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid WindowSwitcherButton::OnBrowserRemoved(const Browser* browser) { 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UpdateStatus(); 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace chromeos 94