Home | History | Annotate | Download | only in status
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/status/window_switcher_button.h"
      6 
      7 #include "chrome/browser/chromeos/status/status_area_host.h"
      8 #include "chrome/browser/chromeos/wm_ipc.h"
      9 #include "chrome/browser/ui/browser_window.h"
     10 #include "grit/generated_resources.h"
     11 #include "grit/theme_resources.h"
     12 #include "ui/base/l10n/l10n_util.h"
     13 #include "ui/base/resource/resource_bundle.h"
     14 #include "ui/gfx/canvas.h"
     15 
     16 namespace chromeos {
     17 
     18 namespace {
     19 int GetNormalBrowserCount() {
     20   int count = 0;
     21   BrowserList::const_iterator iter;
     22   for (iter = BrowserList::begin(); iter != BrowserList::end(); ++iter) {
     23     if ((*iter)->type() == Browser::TYPE_NORMAL)
     24       count++;
     25   }
     26   return count;
     27 }
     28 }
     29 
     30 WindowSwitcherButton::WindowSwitcherButton(StatusAreaHost* host)
     31     : StatusAreaButton(host, this) {
     32   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
     33   SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WINDOW_SWITCHER));
     34   SetEnabled(true);
     35 
     36   UpdateStatus();
     37   BrowserList::AddObserver(this);
     38 }
     39 
     40 WindowSwitcherButton::~WindowSwitcherButton() {
     41   BrowserList::RemoveObserver(this);
     42 }
     43 
     44 void WindowSwitcherButton::UpdateStatus() {
     45   if (GetNormalBrowserCount() < 2) {
     46     // There are less than two browsers.  This means we can't switch
     47     // anywhere, so we disappear.
     48     SetTooltipText(L"");
     49     SetVisible(false);
     50     PreferredSizeChanged();
     51     return;
     52   }
     53 
     54   SetTooltipText(UTF16ToWide(l10n_util::GetStringUTF16(
     55       IDS_STATUSBAR_WINDOW_SWITCHER_TOOLTIP)));
     56 
     57   // There are at least two browsers, so we show ourselves.
     58   SetVisible(true);
     59   PreferredSizeChanged();
     60 }
     61 
     62 ////////////////////////////////////////////////////////////////////////////////
     63 // WindowSwitcherButton, views::ViewMenuDelegate implementation:
     64 
     65 void WindowSwitcherButton::RunMenu(views::View* source, const gfx::Point& pt) {
     66   // Don't do anything if there aren't at least two normal browsers to
     67   // switch between.
     68   if (GetNormalBrowserCount() < 2)
     69     return;
     70 
     71   // Send a message to the ChromeOS window manager to switch to the
     72   // next top level browser window.  Only the window manager knows
     73   // what order they are in, so we can't use Chrome's browser list
     74   // to decide.
     75   WmIpc::Message message(chromeos::WM_IPC_MESSAGE_WM_CYCLE_WINDOWS);
     76   message.set_param(0, true);
     77   WmIpc::instance()->SendMessage(message);
     78 }
     79 
     80 ////////////////////////////////////////////////////////////////////////////////
     81 // BrowserList::Observer implementation:
     82 
     83 // Called immediately after a browser is added to the list
     84 void WindowSwitcherButton::OnBrowserAdded(const Browser* browser) {
     85   UpdateStatus();
     86 }
     87 
     88 // Called immediately after a browser is removed from the list
     89 void WindowSwitcherButton::OnBrowserRemoved(const Browser* browser) {
     90   UpdateStatus();
     91 }
     92 
     93 }  // namespace chromeos
     94