// 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. #ifndef UI_VIEWS_WINDOW_DIALOG_DELEGATE_H_ #define UI_VIEWS_WINDOW_DIALOG_DELEGATE_H_ #include "base/compiler_specific.h" #include "base/strings/string16.h" #include "ui/base/accessibility/accessibility_types.h" #include "ui/base/models/dialog_model.h" #include "ui/base/ui_base_types.h" #include "ui/views/widget/widget_delegate.h" namespace views { class DialogClientView; /////////////////////////////////////////////////////////////////////////////// // // DialogDelegate // // DialogDelegate is an interface implemented by objects that wish to show a // dialog box Window. The window that is displayed uses this interface to // determine how it should be displayed and notify the delegate object of // certain events. // /////////////////////////////////////////////////////////////////////////////// class VIEWS_EXPORT DialogDelegate : public ui::DialogModel, public WidgetDelegate { public: virtual ~DialogDelegate(); // Returns whether to use the new dialog style in general. // See UseNewStyleForThisDialog() for dialog-specific styling. static bool UseNewStyle(); // Create a |dialog| window Widget with the specified |context| or |parent|. static Widget* CreateDialogWidget(DialogDelegate* dialog, gfx::NativeWindow context, gfx::NativeWindow parent); // Override this function to display an extra view adjacent to the buttons. // Overrides may construct the view; this will only be called once per dialog. virtual View* CreateExtraView(); // Override this function to display an extra view in the titlebar. // Overrides may construct the view; this will only be called once per dialog. // Note: this only works for new style dialogs. virtual View* CreateTitlebarExtraView(); // Override this function to display a footnote view below the buttons. // Overrides may construct the view; this will only be called once per dialog. virtual View* CreateFootnoteView(); // For Dialog boxes, if there is a "Cancel" button or no dialog button at all, // this is called when the user presses the "Cancel" button or the Esc key. // It can also be called on a close action if |Close| has not been // overridden. This function should return true if the window can be closed // after it returns, or false if it must remain open. virtual bool Cancel(); // For Dialog boxes, this is called when the user presses the "OK" button, // or the Enter key. It can also be called on a close action if |Close| // has not been overridden. This function should return true if the window // can be closed after it returns, or false if it must remain open. // If |window_closing| is true, it means that this handler is // being called because the window is being closed (e.g. by Window::Close) // and there is no Cancel handler, so Accept is being called instead. virtual bool Accept(bool window_closing); virtual bool Accept(); // Called when the user closes the window without selecting an option, // e.g. by pressing the close button on the window or using a window manager // gesture. By default, this calls Accept() if the only button in the dialog // is Accept, Cancel() otherwise. This function should return true if the // window can be closed after it returns, or false if it must remain open. virtual bool Close(); // Overridden from ui::DialogModel: virtual base::string16 GetDialogLabel() const OVERRIDE; virtual base::string16 GetDialogTitle() const OVERRIDE; virtual int GetDialogButtons() const OVERRIDE; virtual int GetDefaultDialogButton() const OVERRIDE; virtual bool ShouldDefaultButtonBeBlue() const OVERRIDE; virtual base::string16 GetDialogButtonLabel( ui::DialogButton button) const OVERRIDE; virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE; // Overridden from WidgetDelegate: virtual View* GetInitiallyFocusedView() OVERRIDE; virtual DialogDelegate* AsDialogDelegate() OVERRIDE; virtual ClientView* CreateClientView(Widget* widget) OVERRIDE; virtual NonClientFrameView* CreateNonClientFrameView(Widget* widget) OVERRIDE; // Create a frame view using the new dialog style. static NonClientFrameView* CreateNewStyleFrameView(Widget* widget); // The semi-transparent border and shadow of the new style frame view does not // work on child windows under Views/Win32. This is a kludge to get a // reasonable-looking opaque border for the dialog. Note that this does not // support arrows. // // TODO(wittman): Remove once WinAura is in place. static NonClientFrameView* CreateNewStyleFrameView(Widget* widget, bool force_opaque_border); // Returns whether this particular dialog should use the new dialog style. virtual bool UseNewStyleForThisDialog() const; // Called when the window has been closed. virtual void OnClosed() {} // A helper for accessing the DialogClientView object contained by this // delegate's Window. const DialogClientView* GetDialogClientView() const; DialogClientView* GetDialogClientView(); protected: // Overridden from WidgetDelegate: virtual ui::AccessibilityTypes::Role GetAccessibleWindowRole() const OVERRIDE; }; // A DialogDelegate implementation that is-a View. Used to override GetWidget() // to call View's GetWidget() for the common case where a DialogDelegate // implementation is-a View. Note that DialogDelegateView is not owned by // view's hierarchy and is expected to be deleted on DeleteDelegate call. class VIEWS_EXPORT DialogDelegateView : public DialogDelegate, public View { public: DialogDelegateView(); virtual ~DialogDelegateView(); // Overridden from DialogDelegate: virtual void DeleteDelegate() OVERRIDE; virtual Widget* GetWidget() OVERRIDE; virtual const Widget* GetWidget() const OVERRIDE; virtual View* GetContentsView() OVERRIDE; private: DISALLOW_COPY_AND_ASSIGN(DialogDelegateView); }; } // namespace views #endif // UI_VIEWS_WINDOW_DIALOG_DELEGATE_H_