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