Chromium Code Reviews| Index: ash/wm/caption_buttons/hideable_caption_button_container.cc |
| diff --git a/ash/wm/caption_buttons/hideable_caption_button_container.cc b/ash/wm/caption_buttons/hideable_caption_button_container.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..288ce4f8bf188ded06103ddd32477e9002257940 |
| --- /dev/null |
| +++ b/ash/wm/caption_buttons/hideable_caption_button_container.cc |
| @@ -0,0 +1,148 @@ |
| +// Copyright 2013 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 "ash/wm/caption_buttons/hideable_caption_button_container.h" |
| + |
| +#include "ash/wm/caption_buttons/frame_caption_button_container_view.h" |
| +#include "base/i18n/rtl.h" |
| +#include "grit/ash_resources.h" |
| +#include "ui/aura/window.h" |
| +#include "ui/base/resource/resource_bundle.h" |
| +#include "ui/gfx/canvas.h" |
| +#include "ui/gfx/image/image.h" |
| +#include "ui/gfx/rect.h" |
| +#include "ui/views/background.h" |
| +#include "ui/views/border.h" |
| +#include "ui/views/widget/widget.h" |
| + |
| +namespace ash { |
| + |
| +namespace { |
| + |
| +// The size of the shadow around the caption buttons. |
|
James Cook
2013/10/02 21:07:55
If this is related to a particular art asset you m
pkotwicz
2013/10/03 20:45:35
The sizes are derived from IDR_AURA_WINDOW_FULLSCR
|
| +const int kShadowSizeX = 16; |
| +const int kShadowSizeBottom = 21; |
| + |
| +// The border for |button_widget_|. |
| +class HideableCaptionButtonContainerBorder : public views::Border { |
| + public: |
| + HideableCaptionButtonContainerBorder() { |
| + int border_id = base::i18n::IsRTL() ? |
| + IDR_AURA_WINDOW_FULLSCREEN_SHADOW_RTL : |
| + IDR_AURA_WINDOW_FULLSCREEN_SHADOW; |
| + border_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| + border_id).AsImageSkia(); |
| + } |
| + |
| + virtual ~HideableCaptionButtonContainerBorder() { |
| + } |
| + |
| + private: |
| + // views::Border overrides: |
| + virtual void Paint(const views::View& view, gfx::Canvas* canvas) OVERRIDE { |
| + canvas->DrawImageInt(border_, 0, view.height() - border_.height()); |
|
pkotwicz
2013/10/03 20:45:35
This code deals with IDR_AURA_WINDOW_FULLSCREEN_SH
|
| + } |
| + |
| + virtual gfx::Insets GetInsets() const OVERRIDE { |
| + return gfx::Insets(0, kShadowSizeX, kShadowSizeBottom, 0); |
| + } |
| + |
| + gfx::ImageSkia border_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(HideableCaptionButtonContainerBorder); |
| +}; |
| + |
| +// The background for |button_widget_|. |
| +class HideableCaptionButtonContainerBackground : public views::Background { |
| + public: |
| + explicit HideableCaptionButtonContainerBackground(int background_id) { |
| + background_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| + background_id).AsImageSkia(); |
| + } |
| + |
| + virtual ~HideableCaptionButtonContainerBackground() { |
| + } |
| + |
| + private: |
| + // views::Background override: |
| + virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE { |
| + gfx::Rect paint_bounds(view->GetContentsBounds()); |
| + paint_bounds.set_x(view->GetMirroredXForRect(paint_bounds)); |
| + canvas->TileImageInt(background_, paint_bounds.x(), paint_bounds.y(), |
| + paint_bounds.width(), paint_bounds.height()); |
| + } |
| + |
| + gfx::ImageSkia background_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(HideableCaptionButtonContainerBackground); |
| +}; |
| + |
| +} // namespace |
| + |
| +// static |
| +const char HideableCaptionButtonContainer::kButtonWindowName[] = |
| + "HideableCaptionButtonContainerWidget"; |
| + |
| +HideableCaptionButtonContainer::HideableCaptionButtonContainer( |
|
James Cook
2013/10/02 21:07:55
Can you add a basic test for this class, something
pkotwicz
2013/10/03 20:45:35
AppBrowserFrameViewAshTest is a sufficiently good
|
| + int background_id, |
| + views::Widget* frame) |
| + : background_id_(background_id), |
| + frame_(frame) { |
| +} |
| + |
| +HideableCaptionButtonContainer::~HideableCaptionButtonContainer() { |
| + frame_->RemoveObserver(this); |
| +} |
| + |
| +void HideableCaptionButtonContainer::ShowButtonWidget() { |
| + // Create view with the caption buttons and a widget to host it. |
| + button_container_ = new FrameCaptionButtonContainerView(frame_, |
|
pkotwicz
2013/10/02 21:11:08
Note to self: This is wrong. We need to select whi
pkotwicz
2013/10/03 20:45:35
The "Note to self" is wrong. We can assume that mi
|
| + ash::FrameCaptionButtonContainerView::MINIMIZE_ALLOWED); |
| + button_container_->set_header_style( |
| + ash::FrameCaptionButtonContainerView::HEADER_STYLE_MAXIMIZED_HOSTED_APP); |
| + button_container_->set_border(new HideableCaptionButtonContainerBorder()); |
| + button_container_->set_background( |
| + new HideableCaptionButtonContainerBackground(background_id_)); |
| + |
| + button_widget_.reset(new views::Widget); |
| + views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); |
| + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| + params.parent = frame_->GetNativeWindow(); |
| + params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| + button_widget_->Init(params); |
| + button_widget_->SetContentsView(button_container_); |
| + button_widget_->GetNativeWindow()->SetName(kButtonWindowName); |
| + |
| + // The shadow border needs to be excluded from the hit test area. |
| + gfx::Insets hit_test_insets(button_container_->GetInsets()); |
| + if (base::i18n::IsRTL()) { |
| + hit_test_insets = gfx::Insets(hit_test_insets.top(), |
| + hit_test_insets.right(), |
| + hit_test_insets.bottom(), |
| + hit_test_insets.left()); |
| + } |
| + button_widget_->GetNativeWindow()->SetHitTestBoundsOverrideOuter( |
| + hit_test_insets, hit_test_insets); |
| + |
| + button_widget_->SetBounds(GetButtonWidgetBounds()); |
| + button_widget_->Show(); |
| + |
| + frame_->AddObserver(this); |
| +} |
| + |
| +gfx::Rect HideableCaptionButtonContainer::GetButtonWidgetBounds() const { |
| + gfx::Size size(button_container_->GetPreferredSize()); |
| + gfx::Rect frame_bounds(frame_->GetNativeWindow()->bounds()); |
| + int x = base::i18n::IsRTL() ? 0 : frame_bounds.width() - size.width(); |
|
James Cook
2013/10/02 21:07:55
It's great you're careful about handling RTL. +1!
|
| + return gfx::Rect(x, 0, size.width(), size.height()); |
| +} |
| + |
| +void HideableCaptionButtonContainer::OnWidgetBoundsChanged( |
| + views::Widget* widget, |
| + const gfx::Rect& new_bounds) { |
| + DCHECK_EQ(frame_, widget); |
| + button_widget_->SetBounds(GetButtonWidgetBounds()); |
| +} |
| + |
| +} // namespace ash |