Index: chrome/browser/ui/views/app_list/app_list_dialog_contents_view.cc |
diff --git a/chrome/browser/ui/views/app_list/app_list_dialog_contents_view.cc b/chrome/browser/ui/views/app_list/app_list_dialog_contents_view.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a786474967d7c963edf30d9acb97dffc1b84f8e4 |
--- /dev/null |
+++ b/chrome/browser/ui/views/app_list/app_list_dialog_contents_view.cc |
@@ -0,0 +1,163 @@ |
+// Copyright 2014 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/ui/views/app_list/app_list_dialog_contents_view.h" |
+ |
+#include "chrome/browser/ui/app_list/app_list_controller_delegate.h" |
+#include "chrome/browser/ui/app_list/app_list_service.h" |
+#include "chrome/browser/ui/host_desktop.h" |
+#include "grit/ui_resources.h" |
+#include "third_party/skia/include/core/SkPaint.h" |
+#include "ui/app_list/app_list_constants.h" |
+#include "ui/base/accelerators/accelerator.h" |
+#include "ui/base/resource/resource_bundle.h" |
+#include "ui/base/ui_base_types.h" |
+#include "ui/events/event_constants.h" |
+#include "ui/events/keycodes/keyboard_codes.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/views/background.h" |
+#include "ui/views/border.h" |
+#include "ui/views/controls/button/label_button.h" |
+#include "ui/views/widget/widget.h" |
+#include "ui/views/window/client_view.h" |
+#include "ui/views/window/native_frame_view.h" |
+#include "ui/views/window/non_client_view.h" |
+ |
+namespace { |
+ |
+// Margin of the close button from the top right-hand corner of the dialog. |
+const int kCloseButtonDialogMargin = 10; |
+ |
+// The radius of the app list overlay (the dialog's background). |
+// TODO(sashab): Using SupportsShadow() from app_list_view.cc, make this |
+// 1px smaller on platforms that support shadows. |
+const int kAppListOverlayBorderRadius = 3; |
+ |
+// The background for App List dialogs, which appears as a rounded rectangle |
+// with the same border radius and color as the app list contents. |
+class AppListOverlayBackground : public views::Background { |
+ public: |
+ AppListOverlayBackground() {} |
+ virtual ~AppListOverlayBackground() {} |
+ |
+ // Overridden from views::Background: |
+ virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE { |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kFill_Style); |
+ paint.setColor(app_list::kContentsBackgroundColor); |
+ canvas->DrawRoundRect( |
+ view->GetContentsBounds(), kAppListOverlayBorderRadius, paint); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(AppListOverlayBackground); |
+}; |
+ |
+} // namespace |
+ |
+AppListDialogContentsView::AppListDialogContentsView( |
+ AppListControllerDelegate* app_list_controller_delegate, |
+ views::View* dialog_body) |
+ : app_list_controller_delegate_(app_list_controller_delegate), |
+ dialog_body_(dialog_body), |
+ close_button_(NULL) { |
+ set_background(new AppListOverlayBackground()); |
+ AddChildView(dialog_body_); |
+ |
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
+ close_button_ = new views::LabelButton(this, base::string16()); |
+ close_button_->SetImage(views::CustomButton::STATE_NORMAL, |
+ *rb.GetImageNamed(IDR_CLOSE_DIALOG).ToImageSkia()); |
+ close_button_->SetImage(views::CustomButton::STATE_HOVERED, |
+ *rb.GetImageNamed(IDR_CLOSE_DIALOG_H).ToImageSkia()); |
+ close_button_->SetImage(views::CustomButton::STATE_PRESSED, |
+ *rb.GetImageNamed(IDR_CLOSE_DIALOG_P).ToImageSkia()); |
+ close_button_->SetBorder(views::Border::NullBorder()); |
+ |
+ // Bind the ESCAPE key to trigger selecting the close button. |
+ ui::Accelerator escape(ui::VKEY_ESCAPE, ui::EF_NONE); |
+ close_button_->AddAccelerator(escape); |
+ |
+ AddChildView(close_button_); |
+} |
+ |
+AppListDialogContentsView::~AppListDialogContentsView() { |
+} |
+ |
+// static |
+views::Widget* AppListDialogContentsView::CreateDialogWidget( |
+ gfx::NativeWindow parent, |
+ const gfx::Rect& bounds, |
+ AppListDialogContentsView* dialog) { |
+ views::Widget::InitParams params; |
+ params.delegate = dialog; |
+ params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
+ params.remove_standard_frame = true; |
+ params.parent = parent; |
+ params.bounds = bounds; |
+ // Since this stretches to the corners of the app list, any shadow we add |
+ // would be hidden anyway, so don't add one. |
+ params.shadow_type = views::Widget::InitParams::SHADOW_TYPE_NONE; |
+ // TODO(sashab): Plumb wm::WindowVisibilityAnimationType through to the |
+ // NativeWindow so that widgets can specify custom animations for their |
+ // windows. Then specify a matching animation for this type of widget, |
+ // such as WINDOW_VISIBILITY_ANIMATION_TYPE_VERTICAL. |
+ |
+ views::Widget* widget = new views::Widget(); |
+ widget->Init(params); |
+ return widget; |
+} |
+ |
+void AppListDialogContentsView::Layout() { |
+ // Place the close button in the top right-hand corner. |
+ close_button_->SetSize(close_button_->GetPreferredSize()); |
+ close_button_->SetPosition( |
+ gfx::Point(width() - close_button_->width() - kCloseButtonDialogMargin, |
+ kCloseButtonDialogMargin)); |
+ |
+ // Stretch the dialog body to fill the whole dialog area. |
+ dialog_body_->SetBoundsRect(GetContentsBounds()); |
+ |
+ // Propagate Layout() calls to subviews. |
+ views::View::Layout(); |
+} |
+ |
+views::View* AppListDialogContentsView::GetInitiallyFocusedView() { |
+ return GetContentsView(); |
+} |
+ |
+views::View* AppListDialogContentsView::GetContentsView() { |
+ return this; |
+} |
+ |
+views::ClientView* AppListDialogContentsView::CreateClientView( |
+ views::Widget* widget) { |
+ return new views::ClientView(widget, GetContentsView()); |
+} |
+ |
+views::NonClientFrameView* AppListDialogContentsView::CreateNonClientFrameView( |
+ views::Widget* widget) { |
+ return new views::NativeFrameView(widget); |
+} |
+ |
+void AppListDialogContentsView::ButtonPressed(views::Button* sender, |
+ const ui::Event& event) { |
+ if (sender == close_button_) { |
+ GetWidget()->Close(); |
+ } else { |
+ NOTREACHED(); |
+ } |
+} |
+ |
+ui::ModalType AppListDialogContentsView::GetModalType() const { |
+ return ui::MODAL_TYPE_WINDOW; |
+} |
+ |
+ui::AXRole AppListDialogContentsView::GetAccessibleWindowRole() const { |
+ return ui::AX_ROLE_DIALOG; |
+} |
+ |
+void AppListDialogContentsView::WindowClosing() { |
+ app_list_controller_delegate_->OnCloseChildDialog(); |
+} |