// Copyright (c) 2011 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. #include "chrome/browser/chromeos/status/window_switcher_button.h" #include "chrome/browser/chromeos/status/status_area_host.h" #include "chrome/browser/chromeos/wm_ipc.h" #include "chrome/browser/ui/browser_window.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" namespace chromeos { namespace { int GetNormalBrowserCount() { int count = 0; BrowserList::const_iterator iter; for (iter = BrowserList::begin(); iter != BrowserList::end(); ++iter) { if ((*iter)->type() == Browser::TYPE_NORMAL) count++; } return count; } } WindowSwitcherButton::WindowSwitcherButton(StatusAreaHost* host) : StatusAreaButton(host, this) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WINDOW_SWITCHER)); SetEnabled(true); UpdateStatus(); BrowserList::AddObserver(this); } WindowSwitcherButton::~WindowSwitcherButton() { BrowserList::RemoveObserver(this); } void WindowSwitcherButton::UpdateStatus() { if (GetNormalBrowserCount() < 2) { // There are less than two browsers. This means we can't switch // anywhere, so we disappear. SetTooltipText(L""); SetVisible(false); PreferredSizeChanged(); return; } SetTooltipText(UTF16ToWide(l10n_util::GetStringUTF16( IDS_STATUSBAR_WINDOW_SWITCHER_TOOLTIP))); // There are at least two browsers, so we show ourselves. SetVisible(true); PreferredSizeChanged(); } //////////////////////////////////////////////////////////////////////////////// // WindowSwitcherButton, views::ViewMenuDelegate implementation: void WindowSwitcherButton::RunMenu(views::View* source, const gfx::Point& pt) { // Don't do anything if there aren't at least two normal browsers to // switch between. if (GetNormalBrowserCount() < 2) return; // Send a message to the ChromeOS window manager to switch to the // next top level browser window. Only the window manager knows // what order they are in, so we can't use Chrome's browser list // to decide. WmIpc::Message message(chromeos::WM_IPC_MESSAGE_WM_CYCLE_WINDOWS); message.set_param(0, true); WmIpc::instance()->SendMessage(message); } //////////////////////////////////////////////////////////////////////////////// // BrowserList::Observer implementation: // Called immediately after a browser is added to the list void WindowSwitcherButton::OnBrowserAdded(const Browser* browser) { UpdateStatus(); } // Called immediately after a browser is removed from the list void WindowSwitcherButton::OnBrowserRemoved(const Browser* browser) { UpdateStatus(); } } // namespace chromeos