Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2649)

Unified Diff: ash/display/display_error_dialog.cc

Issue 12212171: Provides more types of errors for output status. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/display/display_error_dialog.cc
diff --git a/ash/display/display_error_dialog.cc b/ash/display/display_error_dialog.cc
index 604d86acf6d9d9d4c9017f8cae2d216b45ade1e0..8a512062f9526a5f29f9bfb5e8fe10dad7acb99b 100644
--- a/ash/display/display_error_dialog.cc
+++ b/ash/display/display_error_dialog.cc
@@ -27,28 +27,20 @@ const int kDialogMessageWidthPixel = 300;
// The margin width from the error message to the edge of the dialog.
const int kDialogMessageMarginWidthPixel = 5;
-DisplayErrorDialog* g_instance = NULL;
-
} // namespace
// static
-void DisplayErrorDialog::ShowDialog() {
- if (g_instance) {
- DCHECK(g_instance->GetWidget());
- g_instance->GetWidget()->StackAtTop();
- g_instance->GetWidget()->Activate();
- return;
- }
-
+DisplayErrorDialog* DisplayErrorDialog::ShowDialog(
+ chromeos::OutputState new_state) {
gfx::Screen* screen = Shell::GetScreen();
const gfx::Display& target_display =
(screen->GetNumDisplays() > 1) ?
ScreenAsh::GetSecondaryDisplay() : screen->GetPrimaryDisplay();
- g_instance = new DisplayErrorDialog();
+ DisplayErrorDialog* dialog = new DisplayErrorDialog(new_state);
views::Widget* widget = new views::Widget;
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
- params.delegate = g_instance;
+ params.delegate = dialog;
// Makes |widget| belong to the target display. Size and location are
// fixed by CenterWindow() below.
params.bounds = target_display.bounds();
@@ -62,12 +54,36 @@ void DisplayErrorDialog::ShowDialog() {
widget->GetNativeView()->SetName("DisplayErrorDialog");
widget->CenterWindow(widget->GetRootView()->GetPreferredSize());
widget->Show();
+ return dialog;
}
-DisplayErrorDialog::DisplayErrorDialog() {
+void DisplayErrorDialog::UpdateMessageForState(
+ chromeos::OutputState new_state) {
+ int message_id = -1;
+ switch (new_state) {
+ case chromeos::STATE_DUAL_MIRROR:
+ message_id = IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING;
+ break;
+ case chromeos::STATE_DUAL_EXTENDED:
+ message_id = IDS_ASH_DISPLAY_FAILURE_ON_EXTENDED;
+ break;
+ default:
+ // The error dialog would appear only for mirroring or extended.
+ // It's quite unlikely to happen with other status (single-display /
+ // invalid / unknown status), but set an unknown error message
+ // instead of NOTREACHED() just in case for safety.
+ LOG(ERROR) << "Unexpected failure for new state: " << new_state;
+ message_id = IDS_ASH_DISPLAY_FAILURE_UNKNOWN;
+ }
+ label_->SetText(l10n_util::GetStringUTF16(message_id));
+ label_->SizeToFit(kDialogMessageWidthPixel);
+ Layout();
+ SchedulePaint();
+}
+
+DisplayErrorDialog::DisplayErrorDialog(chromeos::OutputState new_state) {
Shell::GetInstance()->display_controller()->AddObserver(this);
- label_ = new views::Label(
- l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING));
+ label_ = new views::Label();
AddChildView(label_);
label_->SetMultiLine(true);
@@ -77,12 +93,12 @@ DisplayErrorDialog::DisplayErrorDialog() {
kDialogMessageMarginWidthPixel,
kDialogMessageMarginWidthPixel,
kDialogMessageMarginWidthPixel));
- label_->SizeToFit(kDialogMessageWidthPixel);
+
+ UpdateMessageForState(new_state);
}
DisplayErrorDialog::~DisplayErrorDialog() {
Shell::GetInstance()->display_controller()->RemoveObserver(this);
- g_instance = NULL;
}
int DisplayErrorDialog::GetDialogButtons() const {
@@ -101,9 +117,32 @@ void DisplayErrorDialog::OnDisplayConfigurationChanging() {
GetWidget()->Close();
}
-// static
-DisplayErrorDialog* DisplayErrorDialog::GetInstanceForTest() {
- return g_instance;
+DisplayErrorObserver::DisplayErrorObserver()
+ : dialog_(NULL) {
+}
+
+DisplayErrorObserver::~DisplayErrorObserver() {
+ DCHECK(!dialog_);
+}
+
+void DisplayErrorObserver::OnDisplayModeChangeFailed(
+ chromeos::OutputState new_state) {
+ if (dialog_) {
+ DCHECK(dialog_->GetWidget());
+ dialog_->UpdateMessageForState(new_state);
+ dialog_->GetWidget()->StackAtTop();
+ dialog_->GetWidget()->Activate();
+ } else {
+ dialog_ = DisplayErrorDialog::ShowDialog(new_state);
+ dialog_->GetWidget()->AddObserver(this);
+ }
+}
+
+void DisplayErrorObserver::OnWidgetClosing(views::Widget* widget) {
+ DCHECK(dialog_);
+ DCHECK_EQ(dialog_->GetWidget(), widget);
+ widget->RemoveObserver(this);
+ dialog_ = NULL;
}
} // namespace internal

Powered by Google App Engine
This is Rietveld 408576698