Index: chrome/browser/ui/views/app_list/app_list_dialog_container.cc |
diff --git a/chrome/browser/ui/views/app_list/app_list_dialog_container.cc b/chrome/browser/ui/views/app_list/app_list_dialog_container.cc |
index c60e48d0372c1bc85dca11960e0ce35eb52aa320..e86ca7dfb8b4cd3123b0e655d15638abc6cb4562 100644 |
--- a/chrome/browser/ui/views/app_list/app_list_dialog_container.cc |
+++ b/chrome/browser/ui/views/app_list/app_list_dialog_container.cc |
@@ -53,22 +53,69 @@ class AppListOverlayBackground : public views::Background { |
DISALLOW_COPY_AND_ASSIGN(AppListOverlayBackground); |
}; |
+// Base container for modal dialogs. Encases a content view in a modal dialog |
+// with an accelerator to close on escape. |
+class BaseDialogContainer : public views::DialogDelegateView { |
+ public: |
+ BaseDialogContainer(views::View* dialog_body, |
+ const base::Closure& close_callback) |
+ : dialog_body_(dialog_body), |
+ close_callback_(close_callback) { |
+ AddChildView(dialog_body_); |
+ // Since we are using a ClientView instead of a DialogClientView, we need to |
+ // manually bind the escape key to close the dialog. |
+ ui::Accelerator escape(ui::VKEY_ESCAPE, ui::EF_NONE); |
+ AddAccelerator(escape); |
+ } |
+ ~BaseDialogContainer() override {} |
+ |
+ protected: |
+ views::View* dialog_body() { return dialog_body_; } |
+ |
+ private: |
+ // Overridden from views::View: |
+ void ViewHierarchyChanged( |
+ const ViewHierarchyChangedDetails& details) override { |
+ views::DialogDelegateView::ViewHierarchyChanged(details); |
+ if (details.is_add && details.child == this) |
+ GetFocusManager()->AdvanceFocus(false); |
+ } |
+ |
+ bool AcceleratorPressed(const ui::Accelerator& accelerator) override { |
+ DCHECK_EQ(accelerator.key_code(), ui::VKEY_ESCAPE); |
+ GetWidget()->Close(); |
+ return true; |
+ } |
+ |
+ // Overridden from views::DialogDelegate: |
+ int GetDialogButtons() const override { return ui::DIALOG_BUTTON_NONE; } |
+ |
+ // Overridden from views::WidgetDelegate: |
+ ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_WINDOW; } |
+ void WindowClosing() override { |
+ if (!close_callback_.is_null()) |
+ close_callback_.Run(); |
+ } |
+ views::ClientView* CreateClientView(views::Widget* widget) override { |
+ return new views::ClientView(widget, GetContentsView()); |
+ } |
+ |
+ views::View* dialog_body_; |
+ const base::Closure close_callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BaseDialogContainer); |
+}; |
+ |
// The contents view for an App List Dialog, which covers the entire app list |
// and adds a close button. |
-class AppListDialogContainer : public views::DialogDelegateView, |
+class AppListDialogContainer : public BaseDialogContainer, |
public views::ButtonListener { |
public: |
AppListDialogContainer(views::View* dialog_body, |
const base::Closure& close_callback) |
- : dialog_body_(dialog_body), |
- close_button_(NULL), |
- close_callback_(close_callback) { |
+ : BaseDialogContainer(dialog_body, close_callback) { |
set_background(new AppListOverlayBackground()); |
- AddChildView(dialog_body_); |
- |
close_button_ = views::BubbleFrameView::CreateCloseButton(this); |
- ui::Accelerator escape(ui::VKEY_ESCAPE, ui::EF_NONE); |
- close_button_->AddAccelerator(escape); |
AddChildView(close_button_); |
} |
~AppListDialogContainer() override {} |
@@ -83,26 +130,11 @@ class AppListDialogContainer : public views::DialogDelegateView, |
gfx::Point(width() - close_button_->width() - kCloseButtonDialogMargin, |
kCloseButtonDialogMargin)); |
- dialog_body_->SetBoundsRect(GetContentsBounds()); |
+ dialog_body()->SetBoundsRect(GetContentsBounds()); |
views::DialogDelegateView::Layout(); |
} |
- void ViewHierarchyChanged( |
- const ViewHierarchyChangedDetails& details) override { |
- views::DialogDelegateView::ViewHierarchyChanged(details); |
- if (details.is_add && details.child == this) |
- GetFocusManager()->AdvanceFocus(false); |
- } |
// Overridden from views::WidgetDelegate: |
- views::View* GetInitiallyFocusedView() override { return NULL; } |
- ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_WINDOW; } |
- void WindowClosing() override { |
- if (!close_callback_.is_null()) |
- close_callback_.Run(); |
- } |
- views::ClientView* CreateClientView(views::Widget* widget) override { |
- return new views::ClientView(widget, GetContentsView()); |
- } |
views::NonClientFrameView* CreateNonClientFrameView( |
views::Widget* widget) override { |
return new views::NativeFrameView(widget); |
@@ -117,9 +149,7 @@ class AppListDialogContainer : public views::DialogDelegateView, |
} |
} |
- views::View* dialog_body_; |
views::LabelButton* close_button_; |
- const base::Closure close_callback_; |
DISALLOW_COPY_AND_ASSIGN(AppListDialogContainer); |
}; |
@@ -150,38 +180,22 @@ class FullSizeBubbleFrameView : public views::BubbleFrameView { |
}; |
// A container view for a native dialog, which sizes to the given fixed |size|. |
-class NativeDialogContainer : public views::DialogDelegateView { |
+class NativeDialogContainer : public BaseDialogContainer { |
public: |
NativeDialogContainer(views::View* dialog_body, |
const gfx::Size& size, |
const base::Closure& close_callback) |
- : size_(size), |
- dialog_body_(dialog_body), |
- close_callback_(close_callback) { |
+ : BaseDialogContainer(dialog_body, close_callback), |
+ size_(size) { |
SetLayoutManager(new views::FillLayout()); |
- AddChildView(dialog_body_); |
} |
~NativeDialogContainer() override {} |
private: |
// Overridden from views::View: |
gfx::Size GetPreferredSize() const override { return size_; } |
- void ViewHierarchyChanged( |
- const ViewHierarchyChangedDetails& details) override { |
- views::DialogDelegateView::ViewHierarchyChanged(details); |
- if (details.is_add && details.child == this) |
- GetFocusManager()->AdvanceFocus(false); |
- } |
// Overridden from views::WidgetDelegate: |
- ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_WINDOW; } |
- void WindowClosing() override { |
- if (!close_callback_.is_null()) |
- close_callback_.Run(); |
- } |
- |
- // Overridden from views::DialogDelegate: |
- int GetDialogButtons() const override { return ui::DIALOG_BUTTON_NONE; } |
views::NonClientFrameView* CreateNonClientFrameView( |
views::Widget* widget) override { |
FullSizeBubbleFrameView* frame = new FullSizeBubbleFrameView(); |
@@ -195,8 +209,6 @@ class NativeDialogContainer : public views::DialogDelegateView { |
} |
const gfx::Size size_; |
- views::View* dialog_body_; |
- const base::Closure close_callback_; |
DISALLOW_COPY_AND_ASSIGN(NativeDialogContainer); |
}; |