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 #ifndef UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_
      6 #define UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_
      7 
      8 #include "ui/base/ui_base_types.h"
      9 #include "ui/views/controls/button/button.h"
     10 #include "ui/views/focus/focus_manager.h"
     11 #include "ui/views/window/client_view.h"
     12 
     13 namespace views {
     14 
     15 class DialogDelegate;
     16 class LabelButton;
     17 class Widget;
     18 
     19 // DialogClientView provides adornments for a dialog's content view, including
     20 // custom-labeled [OK] and [Cancel] buttons with [Enter] and [Esc] accelerators.
     21 // The view also displays the delegate's extra view alongside the buttons and
     22 // the delegate's footnote view below the buttons. The view appears like below.
     23 // NOTE: The contents view is not inset on the top or side client view edges.
     24 //   +------------------------------+
     25 //   |        Contents View         |
     26 //   +------------------------------+
     27 //   | [Extra View]   [OK] [Cancel] |
     28 //   | [      Footnote View       ] |
     29 //   +------------------------------+
     30 class VIEWS_EXPORT DialogClientView : public ClientView,
     31                                       public ButtonListener,
     32                                       public FocusChangeListener {
     33  public:
     34   DialogClientView(Widget* widget, View* contents_view);
     35   virtual ~DialogClientView();
     36 
     37   // Accept or Cancel the dialog.
     38   void AcceptWindow();
     39   void CancelWindow();
     40 
     41   // Accessors in case the user wishes to adjust these buttons.
     42   LabelButton* ok_button() const { return ok_button_; }
     43   LabelButton* cancel_button() const { return cancel_button_; }
     44 
     45   // Update the dialog buttons to match the dialog's delegate.
     46   void UpdateDialogButtons();
     47 
     48   // ClientView implementation:
     49   virtual bool CanClose() OVERRIDE;
     50   virtual DialogClientView* AsDialogClientView() OVERRIDE;
     51   virtual const DialogClientView* AsDialogClientView() const OVERRIDE;
     52 
     53   // FocusChangeListener implementation:
     54   virtual void OnWillChangeFocus(View* focused_before,
     55                                  View* focused_now) OVERRIDE;
     56   virtual void OnDidChangeFocus(View* focused_before,
     57                                 View* focused_now) OVERRIDE;
     58 
     59   // View implementation:
     60   virtual gfx::Size GetPreferredSize() OVERRIDE;
     61   virtual void Layout() OVERRIDE;
     62   virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
     63   virtual void ViewHierarchyChanged(
     64       const ViewHierarchyChangedDetails& details) OVERRIDE;
     65 
     66   // ButtonListener implementation:
     67   virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE;
     68 
     69  protected:
     70   // For testing.
     71   DialogClientView(View* contents_view);
     72 
     73   // Returns the DialogDelegate for the window. Virtual for testing.
     74   virtual DialogDelegate* GetDialogDelegate() const;
     75 
     76   // Create and add the extra view, if supplied by the delegate.
     77   void CreateExtraView();
     78 
     79   // Creates and adds the footnote view, if supplied by the delegate.
     80   void CreateFootnoteView();
     81 
     82   // View implementation.
     83   virtual void ChildPreferredSizeChanged(View* child) OVERRIDE;
     84   virtual void ChildVisibilityChanged(View* child) OVERRIDE;
     85 
     86  private:
     87   bool has_dialog_buttons() const { return ok_button_ || cancel_button_; }
     88 
     89   // Create a dialog button of the appropriate type.
     90   LabelButton* CreateDialogButton(ui::DialogButton type);
     91 
     92   // Update |button|'s text and enabled state according to the delegate's state.
     93   void UpdateButton(LabelButton* button, ui::DialogButton type);
     94 
     95   // Returns the height of the row containing the buttons and the extra view.
     96   int GetButtonsAndExtraViewRowHeight() const;
     97 
     98   // Returns the insets for the buttons and extra view.
     99   gfx::Insets GetButtonRowInsets() const;
    100 
    101   // Closes the widget.
    102   void Close();
    103 
    104   // The dialog buttons.
    105   LabelButton* ok_button_;
    106   LabelButton* cancel_button_;
    107 
    108   // The button that is currently default; may be NULL.
    109   LabelButton* default_button_;
    110 
    111   // Observe |focus_manager_| to update the default button with focus changes.
    112   FocusManager* focus_manager_;
    113 
    114   // The extra view shown in the row of buttons; may be NULL.
    115   View* extra_view_;
    116 
    117   // The footnote view shown below the buttons; may be NULL.
    118   View* footnote_view_;
    119 
    120   // True if we've notified the delegate the window is closing and the delegate
    121   // allosed the close. In some situations it's possible to get two closes (see
    122   // http://crbug.com/71940). This is used to avoid notifying the delegate
    123   // twice, which can have bad consequences.
    124   bool notified_delegate_;
    125 
    126   DISALLOW_COPY_AND_ASSIGN(DialogClientView);
    127 };
    128 
    129 }  // namespace views
    130 
    131 #endif  // UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_
    132