// Copyright (c) 2012 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 "ui/views/window/dialog_delegate.h" #include "base/logging.h" #include "ui/base/l10n/l10n_util.h" #include "ui/strings/grit/ui_strings.h" #include "ui/views/bubble/bubble_border.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_observer.h" #include "ui/views/window/dialog_client_view.h" #if defined(OS_WIN) #include "ui/base/win/shell.h" #endif namespace views { //////////////////////////////////////////////////////////////////////////////// // DialogDelegate: DialogDelegate::DialogDelegate() : supports_new_style_(true) { } DialogDelegate::~DialogDelegate() { } // static Widget* DialogDelegate::CreateDialogWidget(WidgetDelegate* delegate, gfx::NativeWindow context, gfx::NativeView parent) { return CreateDialogWidgetWithBounds(delegate, context, parent, gfx::Rect()); } // static Widget* DialogDelegate::CreateDialogWidgetWithBounds(WidgetDelegate* delegate, gfx::NativeWindow context, gfx::NativeView parent, const gfx::Rect& bounds) { views::Widget* widget = new views::Widget; views::Widget::InitParams params; params.delegate = delegate; params.bounds = bounds; DialogDelegate* dialog = delegate->AsDialogDelegate(); #if defined(OS_LINUX) && !defined(OS_CHROMEOS) // The new style doesn't support unparented dialogs on Linux desktop. if (dialog) dialog->supports_new_style_ &= parent != NULL; #elif defined(OS_WIN) // The new style doesn't support unparented dialogs on Windows Classic themes. if (dialog && !ui::win::IsAeroGlassEnabled()) dialog->supports_new_style_ &= parent != NULL; #endif if (!dialog || dialog->UseNewStyleForThisDialog()) { params.opacity = Widget::InitParams::TRANSLUCENT_WINDOW; params.remove_standard_frame = true; // The bubble frame includes its own shadow; remove any native shadowing. params.shadow_type = views::Widget::InitParams::SHADOW_TYPE_NONE; } params.context = context; params.parent = parent; // Web-modal (ui::MODAL_TYPE_CHILD) dialogs with parents are marked as child // widgets to prevent top-level window behavior (independent movement, etc). params.child = parent && (delegate->GetModalType() == ui::MODAL_TYPE_CHILD); widget->Init(params); return widget; } View* DialogDelegate::CreateExtraView() { return NULL; } View* DialogDelegate::CreateTitlebarExtraView() { return NULL; } View* DialogDelegate::CreateFootnoteView() { return NULL; } bool DialogDelegate::Cancel() { return true; } bool DialogDelegate::Accept(bool window_closing) { return Accept(); } bool DialogDelegate::Accept() { return true; } bool DialogDelegate::Close() { int buttons = GetDialogButtons(); if ((buttons & ui::DIALOG_BUTTON_CANCEL) || (buttons == ui::DIALOG_BUTTON_NONE)) { return Cancel(); } return Accept(true); } base::string16 DialogDelegate::GetDialogLabel() const { return base::string16(); } base::string16 DialogDelegate::GetDialogTitle() const { return GetWindowTitle(); } int DialogDelegate::GetDialogButtons() const { return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL; } int DialogDelegate::GetDefaultDialogButton() const { if (GetDialogButtons() & ui::DIALOG_BUTTON_OK) return ui::DIALOG_BUTTON_OK; if (GetDialogButtons() & ui::DIALOG_BUTTON_CANCEL) return ui::DIALOG_BUTTON_CANCEL; return ui::DIALOG_BUTTON_NONE; } bool DialogDelegate::ShouldDefaultButtonBeBlue() const { return false; } base::string16 DialogDelegate::GetDialogButtonLabel( ui::DialogButton button) const { if (button == ui::DIALOG_BUTTON_OK) return l10n_util::GetStringUTF16(IDS_APP_OK); if (button == ui::DIALOG_BUTTON_CANCEL) { if (GetDialogButtons() & ui::DIALOG_BUTTON_OK) return l10n_util::GetStringUTF16(IDS_APP_CANCEL); return l10n_util::GetStringUTF16(IDS_APP_CLOSE); } NOTREACHED(); return base::string16(); } bool DialogDelegate::IsDialogButtonEnabled(ui::DialogButton button) const { return true; } View* DialogDelegate::GetInitiallyFocusedView() { // Focus the default button if any. const DialogClientView* dcv = GetDialogClientView(); int default_button = GetDefaultDialogButton(); if (default_button == ui::DIALOG_BUTTON_NONE) return NULL; if ((default_button & GetDialogButtons()) == 0) { // The default button is a button we don't have. NOTREACHED(); return NULL; } if (default_button & ui::DIALOG_BUTTON_OK) return dcv->ok_button(); if (default_button & ui::DIALOG_BUTTON_CANCEL) return dcv->cancel_button(); return NULL; } DialogDelegate* DialogDelegate::AsDialogDelegate() { return this; } ClientView* DialogDelegate::CreateClientView(Widget* widget) { return new DialogClientView(widget, GetContentsView()); } NonClientFrameView* DialogDelegate::CreateNonClientFrameView(Widget* widget) { if (UseNewStyleForThisDialog()) return CreateDialogFrameView(widget); return WidgetDelegate::CreateNonClientFrameView(widget); } // static NonClientFrameView* DialogDelegate::CreateDialogFrameView(Widget* widget) { BubbleFrameView* frame = new BubbleFrameView(gfx::Insets()); scoped_ptr<BubbleBorder> border(new BubbleBorder( BubbleBorder::FLOAT, BubbleBorder::SMALL_SHADOW, SK_ColorRED)); border->set_use_theme_background_color(true); frame->SetBubbleBorder(border.Pass()); DialogDelegate* delegate = widget->widget_delegate()->AsDialogDelegate(); if (delegate) { View* titlebar_view = delegate->CreateTitlebarExtraView(); if (titlebar_view) frame->SetTitlebarExtraView(titlebar_view); } return frame; } bool DialogDelegate::UseNewStyleForThisDialog() const { return supports_new_style_; } const DialogClientView* DialogDelegate::GetDialogClientView() const { return GetWidget()->client_view()->AsDialogClientView(); } DialogClientView* DialogDelegate::GetDialogClientView() { return GetWidget()->client_view()->AsDialogClientView(); } ui::AXRole DialogDelegate::GetAccessibleWindowRole() const { return ui::AX_ROLE_DIALOG; } //////////////////////////////////////////////////////////////////////////////// // DialogDelegateView: DialogDelegateView::DialogDelegateView() { // A WidgetDelegate should be deleted on DeleteDelegate. set_owned_by_client(); } DialogDelegateView::~DialogDelegateView() {} void DialogDelegateView::DeleteDelegate() { delete this; } Widget* DialogDelegateView::GetWidget() { return View::GetWidget(); } const Widget* DialogDelegateView::GetWidget() const { return View::GetWidget(); } View* DialogDelegateView::GetContentsView() { return this; } } // namespace views