// 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/status_area_view.h" #include <algorithm> #include "chrome/browser/chromeos/status/clock_menu_button.h" #include "chrome/browser/chromeos/status/input_method_menu_button.h" #include "chrome/browser/chromeos/status/network_menu_button.h" #include "chrome/browser/chromeos/status/power_menu_button.h" #include "chrome/browser/chromeos/status/status_area_host.h" #include "chrome/browser/chromeos/status/window_switcher_button.h" #include "grit/theme_resources.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" #include "views/border.h" #include "views/controls/image_view.h" namespace chromeos { // Number of pixels to separate each icon. const int kSeparation = 5; StatusAreaView::StatusAreaView(StatusAreaHost* host) : host_(host), clock_view_(NULL), input_method_view_(NULL), network_view_(NULL), power_view_(NULL), window_switcher_view_(NULL) { } void StatusAreaView::Init() { // Clock. clock_view_ = new ClockMenuButton(host_); clock_view_->set_border(views::Border::CreateEmptyBorder(0, 1, 0, 0)); AddChildView(clock_view_); // InputMethod. input_method_view_ = new InputMethodMenuButton(host_); AddChildView(input_method_view_); // Network. network_view_ = new NetworkMenuButton(host_); AddChildView(network_view_); // Power. power_view_ = new PowerMenuButton(host_); AddChildView(power_view_); // Window Switcher. window_switcher_view_ = new WindowSwitcherButton(host_); AddChildView(window_switcher_view_); } gfx::Size StatusAreaView::GetPreferredSize() { int result_w = kSeparation; int result_h = 0; int visible_count = 0; for (int i = 0; i < child_count(); i++) { views::View* cur = GetChildViewAt(i); if (cur->IsVisible()) { visible_count++; gfx::Size cur_size = cur->GetPreferredSize(); // Add each width. result_w += cur_size.width() + kSeparation; // Use max height. result_h = std::max(result_h, cur_size.height()); } } if (visible_count > 0) result_w -= kSeparation; return gfx::Size(result_w, result_h); } void StatusAreaView::Layout() { int cur_x = kSeparation; for (int i = 0; i < child_count(); i++) { views::View* cur = GetChildViewAt(i); if (cur->IsVisible()) { gfx::Size cur_size = cur->GetPreferredSize(); int cur_y = (height() - cur_size.height()) / 2; // Handle odd number of pixels. cur_y += (height() - cur_size.height()) % 2; // Put next in row horizontally, and center vertically. cur->SetBounds(cur_x, cur_y, cur_size.width(), cur_size.height()); if (cur_size.width() > 0) cur_x += cur_size.width() + kSeparation; } } } void StatusAreaView::ChildPreferredSizeChanged(View* child) { // When something like the clock menu button's size changes, we need to // relayout. Also mark that this view's size has changed. This will let // BrowserView know to relayout, which will reset the bounds of this view. Layout(); PreferredSizeChanged(); } void StatusAreaView::MakeButtonsActive(bool active) { clock_view()->set_active(active); input_method_view()->set_active(active); network_view()->set_active(active); power_view()->set_active(active); } } // namespace chromeos