Home | History | Annotate | Download | only in window
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/views/window/dialog_delegate.h"
      6 
      7 #include "base/logging.h"
      8 #include "grit/ui_strings.h"
      9 #include "ui/base/l10n/l10n_util.h"
     10 #include "ui/views/bubble/bubble_border.h"
     11 #include "ui/views/bubble/bubble_frame_view.h"
     12 #include "ui/views/controls/button/label_button.h"
     13 #include "ui/views/widget/widget.h"
     14 #include "ui/views/widget/widget_observer.h"
     15 #include "ui/views/window/dialog_client_view.h"
     16 
     17 #if defined(USE_AURA)
     18 #include "ui/views/corewm/shadow_types.h"
     19 #endif
     20 
     21 namespace views {
     22 
     23 ////////////////////////////////////////////////////////////////////////////////
     24 // DialogDelegate:
     25 
     26 DialogDelegate::~DialogDelegate() {
     27 }
     28 
     29 // static
     30 Widget* DialogDelegate::CreateDialogWidget(DialogDelegate* dialog,
     31                                            gfx::NativeWindow context,
     32                                            gfx::NativeWindow parent) {
     33   views::Widget* widget = new views::Widget;
     34   views::Widget::InitParams params;
     35   params.delegate = dialog;
     36   if (!dialog || dialog->UseNewStyleForThisDialog()) {
     37     params.opacity = Widget::InitParams::TRANSLUCENT_WINDOW;
     38     params.remove_standard_frame = true;
     39   }
     40   params.context = context;
     41   params.parent = parent;
     42   params.top_level = true;
     43   widget->Init(params);
     44   return widget;
     45 }
     46 
     47 View* DialogDelegate::CreateExtraView() {
     48   return NULL;
     49 }
     50 
     51 View* DialogDelegate::CreateTitlebarExtraView() {
     52   return NULL;
     53 }
     54 
     55 View* DialogDelegate::CreateFootnoteView() {
     56   return NULL;
     57 }
     58 
     59 bool DialogDelegate::Cancel() {
     60   return true;
     61 }
     62 
     63 bool DialogDelegate::Accept(bool window_closing) {
     64   return Accept();
     65 }
     66 
     67 bool DialogDelegate::Accept() {
     68   return true;
     69 }
     70 
     71 bool DialogDelegate::Close() {
     72   int buttons = GetDialogButtons();
     73   if ((buttons & ui::DIALOG_BUTTON_CANCEL) ||
     74       (buttons == ui::DIALOG_BUTTON_NONE)) {
     75     return Cancel();
     76   }
     77   return Accept(true);
     78 }
     79 
     80 base::string16 DialogDelegate::GetDialogLabel() const {
     81   return base::string16();
     82 }
     83 
     84 base::string16 DialogDelegate::GetDialogTitle() const {
     85   return GetWindowTitle();
     86 }
     87 
     88 int DialogDelegate::GetDialogButtons() const {
     89   return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL;
     90 }
     91 
     92 int DialogDelegate::GetDefaultDialogButton() const {
     93   if (GetDialogButtons() & ui::DIALOG_BUTTON_OK)
     94     return ui::DIALOG_BUTTON_OK;
     95   if (GetDialogButtons() & ui::DIALOG_BUTTON_CANCEL)
     96     return ui::DIALOG_BUTTON_CANCEL;
     97   return ui::DIALOG_BUTTON_NONE;
     98 }
     99 
    100 bool DialogDelegate::ShouldDefaultButtonBeBlue() const {
    101   return false;
    102 }
    103 
    104 base::string16 DialogDelegate::GetDialogButtonLabel(
    105     ui::DialogButton button) const {
    106   if (button == ui::DIALOG_BUTTON_OK)
    107     return l10n_util::GetStringUTF16(IDS_APP_OK);
    108   if (button == ui::DIALOG_BUTTON_CANCEL) {
    109     if (GetDialogButtons() & ui::DIALOG_BUTTON_OK)
    110       return l10n_util::GetStringUTF16(IDS_APP_CANCEL);
    111     return l10n_util::GetStringUTF16(IDS_APP_CLOSE);
    112   }
    113   NOTREACHED();
    114   return base::string16();
    115 }
    116 
    117 bool DialogDelegate::IsDialogButtonEnabled(ui::DialogButton button) const {
    118   return true;
    119 }
    120 
    121 View* DialogDelegate::GetInitiallyFocusedView() {
    122   // Focus the default button if any.
    123   const DialogClientView* dcv = GetDialogClientView();
    124   int default_button = GetDefaultDialogButton();
    125   if (default_button == ui::DIALOG_BUTTON_NONE)
    126     return NULL;
    127 
    128   if ((default_button & GetDialogButtons()) == 0) {
    129     // The default button is a button we don't have.
    130     NOTREACHED();
    131     return NULL;
    132   }
    133 
    134   if (default_button & ui::DIALOG_BUTTON_OK)
    135     return dcv->ok_button();
    136   if (default_button & ui::DIALOG_BUTTON_CANCEL)
    137     return dcv->cancel_button();
    138   return NULL;
    139 }
    140 
    141 DialogDelegate* DialogDelegate::AsDialogDelegate() {
    142   return this;
    143 }
    144 
    145 ClientView* DialogDelegate::CreateClientView(Widget* widget) {
    146   return new DialogClientView(widget, GetContentsView());
    147 }
    148 
    149 NonClientFrameView* DialogDelegate::CreateNonClientFrameView(Widget* widget) {
    150   if (UseNewStyleForThisDialog())
    151     return CreateDialogFrameView(widget);
    152   return WidgetDelegate::CreateNonClientFrameView(widget);
    153 }
    154 
    155 // static
    156 NonClientFrameView* DialogDelegate::CreateDialogFrameView(Widget* widget) {
    157   return CreateDialogFrameView(widget, false);
    158 }
    159 
    160 // static
    161 NonClientFrameView* DialogDelegate::CreateDialogFrameView(
    162     Widget* widget,
    163     bool force_opaque_border) {
    164   BubbleFrameView* frame = new BubbleFrameView(gfx::Insets());
    165   const SkColor color = widget->GetNativeTheme()->GetSystemColor(
    166       ui::NativeTheme::kColorId_DialogBackground);
    167   if (force_opaque_border) {
    168     frame->SetBubbleBorder(new BubbleBorder(
    169         BubbleBorder::NONE,
    170         BubbleBorder::NO_SHADOW_OPAQUE_BORDER,
    171         color));
    172   } else {
    173     frame->SetBubbleBorder(new BubbleBorder(BubbleBorder::FLOAT,
    174                                             BubbleBorder::SMALL_SHADOW,
    175                                             color));
    176   }
    177   DialogDelegate* delegate = widget->widget_delegate()->AsDialogDelegate();
    178   if (delegate) {
    179     View* titlebar_view = delegate->CreateTitlebarExtraView();
    180     if (titlebar_view)
    181       frame->SetTitlebarExtraView(titlebar_view);
    182   }
    183   if (force_opaque_border)
    184     widget->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM);
    185 #if defined(USE_AURA)
    186   // TODO(msw): Add a matching shadow type and remove the bubble frame border?
    187   corewm::SetShadowType(widget->GetNativeWindow(), corewm::SHADOW_TYPE_NONE);
    188 #endif
    189   return frame;
    190 }
    191 
    192 bool DialogDelegate::UseNewStyleForThisDialog() const {
    193   return true;
    194 }
    195 
    196 const DialogClientView* DialogDelegate::GetDialogClientView() const {
    197   return GetWidget()->client_view()->AsDialogClientView();
    198 }
    199 
    200 DialogClientView* DialogDelegate::GetDialogClientView() {
    201   return GetWidget()->client_view()->AsDialogClientView();
    202 }
    203 
    204 ui::AccessibilityTypes::Role DialogDelegate::GetAccessibleWindowRole() const {
    205   return ui::AccessibilityTypes::ROLE_DIALOG;
    206 }
    207 
    208 ////////////////////////////////////////////////////////////////////////////////
    209 // DialogDelegateView:
    210 
    211 DialogDelegateView::DialogDelegateView() {
    212   // A WidgetDelegate should be deleted on DeleteDelegate.
    213   set_owned_by_client();
    214 }
    215 
    216 DialogDelegateView::~DialogDelegateView() {}
    217 
    218 void DialogDelegateView::DeleteDelegate() {
    219   delete this;
    220 }
    221 
    222 Widget* DialogDelegateView::GetWidget() {
    223   return View::GetWidget();
    224 }
    225 
    226 const Widget* DialogDelegateView::GetWidget() const {
    227   return View::GetWidget();
    228 }
    229 
    230 View* DialogDelegateView::GetContentsView() {
    231   return this;
    232 }
    233 
    234 }  // namespace views
    235