1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::AddDialog(AppModalDialog* dialog) {
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!active_dialog_) {
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowModalDialog(dialog);
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_modal_dialog_queue_.push(dialog);
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::ShowNextDialog() {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* dialog = GetNextDialog();
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (dialog)
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowModalDialog(dialog);
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    active_dialog_ = NULL;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::ActivateModalDialog() {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (showing_modal_dialog_) {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // As part of showing a modal dialog we may end up back in this method
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // (showing a dialog activates the TabContents, which can trigger a call
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // to ActivateModalDialog). We ignore such a request as after the call to
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // activate the tab contents the dialog is shown.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (active_dialog_)
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    active_dialog_->ActivateModalDialog();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAppModalDialogQueue::AppModalDialogQueue()
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : active_dialog_(NULL), showing_modal_dialog_(false) {
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
41731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAppModalDialogQueue::~AppModalDialogQueue() {}
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// static
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenAppModalDialogQueue* AppModalDialogQueue::GetInstance() {
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return Singleton<AppModalDialogQueue>::get();
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::ShowModalDialog(AppModalDialog* dialog) {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Be sure and set the active_dialog_ field first, otherwise if
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ShowModalDialog triggers a call back to the queue they'll get the old
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dialog. Also, if the dialog calls |ShowNextDialog()| before returning, that
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // would write NULL into |active_dialog_| and this function would then undo
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  active_dialog_ = dialog;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  showing_modal_dialog_ = true;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dialog->ShowModalDialog();
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  showing_modal_dialog_ = false;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAppModalDialog* AppModalDialogQueue::GetNextDialog() {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (!app_modal_dialog_queue_.empty()) {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AppModalDialog* dialog = app_modal_dialog_queue_.front();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    app_modal_dialog_queue_.pop();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (dialog->IsValid())
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return dialog;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete dialog;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return NULL;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
70