This source file includes following definitions.
- message_box_view_
- GetDialogButtons
- GetDialogButtonLabel
- Cancel
- Accept
- GetWindowTitle
- DeleteDelegate
- GetModalType
- GetContentsView
- GetWidget
- GetWidget
- Done
- GetMessageBoxFlagsFromType
- ShowMessageBoxImpl
- ShowMessageBox
- ShowMessageBoxWithButtonText
#include "chrome/browser/ui/simple_message_box.h"
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/message_loop/message_loop.h"
#include "chrome/browser/ui/views/constrained_window_views.h"
#include "grit/generated_resources.h"
#include "ui/aura/window.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/controls/message_box_view.h"
#include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_delegate.h"
#include "ui/wm/public/dispatcher_client.h"
#if defined(OS_WIN)
#include "ui/base/win/message_box_win.h"
#include "ui/views/win/hwnd_util.h"
#endif
namespace chrome {
namespace {
class SimpleMessageBoxViews : public views::DialogDelegate {
public:
SimpleMessageBoxViews(const base::string16& title,
const base::string16& message,
MessageBoxType type,
const base::string16& yes_text,
const base::string16& no_text,
MessageBoxResult* result);
virtual ~SimpleMessageBoxViews();
virtual int GetDialogButtons() const OVERRIDE;
virtual base::string16 GetDialogButtonLabel(
ui::DialogButton button) const OVERRIDE;
virtual bool Cancel() OVERRIDE;
virtual bool Accept() OVERRIDE;
virtual base::string16 GetWindowTitle() const OVERRIDE;
virtual void DeleteDelegate() OVERRIDE;
virtual ui::ModalType GetModalType() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE;
virtual views::Widget* GetWidget() OVERRIDE;
virtual const views::Widget* GetWidget() const OVERRIDE;
private:
void Done();
const base::string16 window_title_;
const MessageBoxType type_;
base::string16 yes_text_;
base::string16 no_text_;
MessageBoxResult* result_;
views::MessageBoxView* message_box_view_;
DISALLOW_COPY_AND_ASSIGN(SimpleMessageBoxViews);
};
SimpleMessageBoxViews::SimpleMessageBoxViews(const base::string16& title,
const base::string16& message,
MessageBoxType type,
const base::string16& yes_text,
const base::string16& no_text,
MessageBoxResult* result)
: window_title_(title),
type_(type),
yes_text_(yes_text),
no_text_(no_text),
result_(result),
message_box_view_(new views::MessageBoxView(
views::MessageBoxView::InitParams(message))) {
CHECK(result_);
if (yes_text_.empty()) {
if (type_ == MESSAGE_BOX_TYPE_QUESTION)
yes_text_ =
l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL);
else if (type_ == MESSAGE_BOX_TYPE_OK_CANCEL)
yes_text_ = l10n_util::GetStringUTF16(IDS_OK);
else
yes_text_ = l10n_util::GetStringUTF16(IDS_OK);
}
if (no_text_.empty()) {
if (type_ == MESSAGE_BOX_TYPE_QUESTION)
no_text_ =
l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL);
else if (type_ == MESSAGE_BOX_TYPE_OK_CANCEL)
no_text_ = l10n_util::GetStringUTF16(IDS_CANCEL);
}
}
SimpleMessageBoxViews::~SimpleMessageBoxViews() {
}
int SimpleMessageBoxViews::GetDialogButtons() const {
if (type_ == MESSAGE_BOX_TYPE_QUESTION ||
type_ == MESSAGE_BOX_TYPE_OK_CANCEL) {
return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL;
}
return ui::DIALOG_BUTTON_OK;
}
base::string16 SimpleMessageBoxViews::GetDialogButtonLabel(
ui::DialogButton button) const {
if (button == ui::DIALOG_BUTTON_CANCEL)
return no_text_;
return yes_text_;
}
bool SimpleMessageBoxViews::Cancel() {
*result_ = MESSAGE_BOX_RESULT_NO;
Done();
return true;
}
bool SimpleMessageBoxViews::Accept() {
*result_ = MESSAGE_BOX_RESULT_YES;
Done();
return true;
}
base::string16 SimpleMessageBoxViews::GetWindowTitle() const {
return window_title_;
}
void SimpleMessageBoxViews::DeleteDelegate() {
delete this;
}
ui::ModalType SimpleMessageBoxViews::GetModalType() const {
return ui::MODAL_TYPE_WINDOW;
}
views::View* SimpleMessageBoxViews::GetContentsView() {
return message_box_view_;
}
views::Widget* SimpleMessageBoxViews::GetWidget() {
return message_box_view_->GetWidget();
}
const views::Widget* SimpleMessageBoxViews::GetWidget() const {
return message_box_view_->GetWidget();
}
void SimpleMessageBoxViews::Done() {
aura::Window* window = GetWidget()->GetNativeView();
aura::client::DispatcherClient* client =
aura::client::GetDispatcherClient(window->GetRootWindow());
client->QuitNestedMessageLoop();
}
#if defined(OS_WIN)
UINT GetMessageBoxFlagsFromType(MessageBoxType type) {
UINT flags = MB_SETFOREGROUND;
switch (type) {
case MESSAGE_BOX_TYPE_INFORMATION:
return flags | MB_OK | MB_ICONINFORMATION;
case MESSAGE_BOX_TYPE_WARNING:
return flags | MB_OK | MB_ICONWARNING;
case MESSAGE_BOX_TYPE_QUESTION:
return flags | MB_YESNO | MB_ICONQUESTION;
case MESSAGE_BOX_TYPE_OK_CANCEL:
return flags | MB_OKCANCEL | MB_ICONWARNING;
}
NOTREACHED();
return flags | MB_OK | MB_ICONWARNING;
}
#endif
MessageBoxResult ShowMessageBoxImpl(gfx::NativeWindow parent,
const base::string16& title,
const base::string16& message,
MessageBoxType type,
const base::string16& yes_text,
const base::string16& no_text) {
if (!base::MessageLoopForUI::IsCurrent() ||
!base::MessageLoopForUI::current()->is_running()) {
#if defined(OS_WIN)
int result = ui::MessageBox(views::HWNDForNativeWindow(parent), message,
title, GetMessageBoxFlagsFromType(type));
return (result == IDYES || result == IDOK) ?
MESSAGE_BOX_RESULT_YES : MESSAGE_BOX_RESULT_NO;
#else
LOG(ERROR) << "Unable to show a dialog outside the UI thread message loop: "
<< title << " - " << message;
return MESSAGE_BOX_RESULT_NO;
#endif
}
MessageBoxResult result = MESSAGE_BOX_RESULT_NO;
SimpleMessageBoxViews* dialog = new SimpleMessageBoxViews(
title, message, type, yes_text, no_text, &result);
CreateBrowserModalDialogViews(dialog, parent)->Show();
aura::Window* anchor = dialog->GetWidget()->GetNativeWindow();
aura::client::DispatcherClient* client =
aura::client::GetDispatcherClient(anchor->GetRootWindow());
client->RunWithDispatcher(NULL);
return result;
}
}
MessageBoxResult ShowMessageBox(gfx::NativeWindow parent,
const base::string16& title,
const base::string16& message,
MessageBoxType type) {
return ShowMessageBoxImpl(
parent, title, message, type, base::string16(), base::string16());
}
MessageBoxResult ShowMessageBoxWithButtonText(gfx::NativeWindow parent,
const base::string16& title,
const base::string16& message,
const base::string16& yes_text,
const base::string16& no_text) {
return ShowMessageBoxImpl(
parent, title, message, MESSAGE_BOX_TYPE_QUESTION, yes_text, no_text);
}
}