| Index: chrome/browser/android/compositor/layer/tab_handle_layer.cc
|
| diff --git a/chrome/browser/android/compositor/layer/tab_handle_layer.cc b/chrome/browser/android/compositor/layer/tab_handle_layer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4e724835f50aad46444a8b153646d6f9cf120dd3
|
| --- /dev/null
|
| +++ b/chrome/browser/android/compositor/layer/tab_handle_layer.cc
|
| @@ -0,0 +1,195 @@
|
| +// Copyright 2015 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/android/compositor/layer/tab_handle_layer.h"
|
| +
|
| +#include "base/i18n/rtl.h"
|
| +#include "cc/layers/layer.h"
|
| +#include "cc/layers/solid_color_layer.h"
|
| +#include "chrome/browser/android/compositor/decoration_title.h"
|
| +#include "chrome/browser/android/compositor/layer_title_cache.h"
|
| +#include "ui/android/resources/resource_manager.h"
|
| +#include "ui/android/resources/ui_resource_android.h"
|
| +#include "ui/base/l10n/l10n_util_android.h"
|
| +
|
| +namespace chrome {
|
| +namespace android {
|
| +
|
| +// static
|
| +scoped_refptr<TabHandleLayer> TabHandleLayer::Create(
|
| + LayerTitleCache* layer_title_cache) {
|
| + return make_scoped_refptr(new TabHandleLayer(layer_title_cache));
|
| +}
|
| +
|
| +void TabHandleLayer::SetProperties(
|
| + int id,
|
| + ui::ResourceManager::Resource* close_button_resource,
|
| + ui::ResourceManager::Resource* tab_handle_resource,
|
| + bool foreground,
|
| + bool close_pressed,
|
| + float toolbar_width,
|
| + float x,
|
| + float y,
|
| + float width,
|
| + float height,
|
| + float content_offset_x,
|
| + float close_button_alpha,
|
| + bool is_loading,
|
| + float spinner_rotation,
|
| + float brightness,
|
| + float border_opacity) {
|
| + if (brightness != brightness_ || foreground != foreground_) {
|
| + brightness_ = brightness;
|
| + foreground_ = foreground;
|
| + cc::FilterOperations filters;
|
| + if (brightness_ != 1.0f && !foreground_)
|
| + filters.Append(cc::FilterOperation::CreateBrightnessFilter(brightness_));
|
| + layer_->SetFilters(filters);
|
| + }
|
| +
|
| + float original_x = x;
|
| + float original_y = y;
|
| + if (foreground_) {
|
| + if (!border_->parent()) {
|
| + layer_->InsertChild(border_, 0);
|
| + border_->SetIsDrawable(true);
|
| + }
|
| + border_->SetBackgroundColor(SK_ColorBLACK);
|
| + border_->SetPosition(gfx::PointF(0, height - 1));
|
| + border_->SetBounds(gfx::Size(toolbar_width, 1));
|
| + border_->SetOpacity(border_opacity);
|
| +
|
| + x = 0;
|
| + y = 0;
|
| + } else if (border_->parent()) {
|
| + border_->RemoveFromParent();
|
| + }
|
| +
|
| + bool is_rtl = l10n_util::IsLayoutRtl();
|
| +
|
| + float margin_width =
|
| + tab_handle_resource->size.width() - tab_handle_resource->aperture.width();
|
| + float margin_height = tab_handle_resource->size.height() -
|
| + tab_handle_resource->aperture.height();
|
| +
|
| + // In the inset case, the |decoration_tab_| nine-patch layer should not have a
|
| + // margin that is greater than the content size of the layer. This case can
|
| + // happen at initialization. The sizes used below are just temp values until
|
| + // the real content sizes arrive.
|
| + if (margin_width >= width) {
|
| + // Shift the left edge over by the adjusted amount for more
|
| + // aesthetic animations.
|
| + x = x - (margin_width - width);
|
| + width = margin_width;
|
| + }
|
| + if (margin_height >= height) {
|
| + y = y - (margin_height - height);
|
| + height = margin_height;
|
| + }
|
| + gfx::Size tab_bounds(width, height);
|
| +
|
| + layer_->SetPosition(gfx::Point(x, y));
|
| + DecorationTitle* title_layer = nullptr;
|
| + if (layer_title_cache_)
|
| + title_layer = layer_title_cache_->GetTitleLayer(id);
|
| +
|
| + if (title_layer) {
|
| + title_layer->setOpacity(1.0f);
|
| + unsigned expected_children = 3;
|
| + if (foreground_)
|
| + expected_children += 1;
|
| + title_layer_ = title_layer->layer();
|
| + if (layer_->children().size() < expected_children) {
|
| + layer_->AddChild(title_layer_);
|
| + } else if (layer_->children()[expected_children - 1]->id() !=
|
| + title_layer_->id()) {
|
| + layer_->ReplaceChild((layer_->children()[expected_children - 1]).get(),
|
| + title_layer_);
|
| + }
|
| + title_layer->SetUIResourceIds();
|
| + } else if (title_layer_.get()) {
|
| + title_layer_->RemoveFromParent();
|
| + title_layer_ = nullptr;
|
| + }
|
| +
|
| + decoration_tab_->SetUIResourceId(tab_handle_resource->ui_resource->id());
|
| + decoration_tab_->SetAperture(tab_handle_resource->aperture);
|
| + decoration_tab_->SetFillCenter(true);
|
| + decoration_tab_->SetBounds(tab_bounds);
|
| + decoration_tab_->SetBorder(
|
| + tab_handle_resource->Border(decoration_tab_->bounds()));
|
| +
|
| + if (foreground_)
|
| + decoration_tab_->SetPosition(gfx::PointF(original_x, original_y));
|
| + else
|
| + decoration_tab_->SetPosition(gfx::PointF(0, 0));
|
| +
|
| + close_button_->SetUIResourceId(close_button_resource->ui_resource->id());
|
| + close_button_->SetBounds(close_button_resource->size);
|
| + const float padding_right =
|
| + tab_handle_resource->size.width() - tab_handle_resource->padding.right();
|
| + const float padding_left = tab_handle_resource->padding.x();
|
| + const float close_width = close_button_->bounds().width();
|
| + if (title_layer) {
|
| + int title_y = tab_handle_resource->padding.y() / 2 + height / 2 -
|
| + title_layer->size().height() / 2;
|
| + int title_x = is_rtl ? padding_left + close_width : padding_left;
|
| + title_x += is_rtl ? 0 : content_offset_x;
|
| + title_layer->setBounds(gfx::Size(
|
| + width - padding_right - padding_left - close_width - content_offset_x,
|
| + height));
|
| + if (foreground_) {
|
| + title_x += original_x;
|
| + title_y += original_y;
|
| + }
|
| + title_layer->layer()->SetPosition(gfx::Point(title_x, title_y));
|
| + if (is_loading) {
|
| + title_layer->SetIsLoading(true);
|
| + title_layer->SetSpinnerRotation(spinner_rotation);
|
| + } else {
|
| + title_layer->SetIsLoading(false);
|
| + }
|
| + }
|
| +
|
| + if (close_button_alpha == 0.f) {
|
| + close_button_->SetIsDrawable(false);
|
| + } else {
|
| + close_button_->SetIsDrawable(true);
|
| + const float close_max_width = close_button_->bounds().width();
|
| + int close_y = (tab_handle_resource->padding.y() + height) / 2 -
|
| + close_button_->bounds().height() / 2;
|
| + int close_x = is_rtl ? padding_left - close_max_width + close_width
|
| + : width - padding_right - close_width;
|
| + if (foreground_) {
|
| + close_y += original_y;
|
| + close_x += original_x;
|
| + }
|
| +
|
| + close_button_->SetPosition(gfx::PointF(close_x, close_y));
|
| + close_button_->SetOpacity(close_button_alpha);
|
| + }
|
| +}
|
| +
|
| +scoped_refptr<cc::Layer> TabHandleLayer::layer() {
|
| + return layer_;
|
| +}
|
| +
|
| +TabHandleLayer::TabHandleLayer(LayerTitleCache* layer_title_cache)
|
| + : layer_title_cache_(layer_title_cache),
|
| + layer_(cc::Layer::Create()),
|
| + close_button_(cc::UIResourceLayer::Create()),
|
| + decoration_tab_(cc::NinePatchLayer::Create()),
|
| + border_(cc::SolidColorLayer::Create()),
|
| + brightness_(1.0f),
|
| + foreground_(false) {
|
| + decoration_tab_->SetIsDrawable(true);
|
| + layer_->AddChild(decoration_tab_);
|
| + layer_->AddChild(close_button_);
|
| +}
|
| +
|
| +TabHandleLayer::~TabHandleLayer() {
|
| +}
|
| +
|
| +} // namespace android
|
| +} // namespace chrome
|
|
|