OLD | NEW |
| (Empty) |
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 COMPONENTS_APP_MODAL_DIALOGS_APP_MODAL_DIALOG_QUEUE_H_ | |
6 #define COMPONENTS_APP_MODAL_DIALOGS_APP_MODAL_DIALOG_QUEUE_H_ | |
7 | |
8 #include <deque> | |
9 | |
10 #include "base/basictypes.h" | |
11 | |
12 class AppModalDialog; | |
13 | |
14 template <typename T> struct DefaultSingletonTraits; | |
15 | |
16 // Keeps a queue of AppModalDialogs, making sure only one app modal | |
17 // dialog is shown at a time. | |
18 // This class is a singleton. | |
19 class AppModalDialogQueue { | |
20 public: | |
21 typedef std::deque<AppModalDialog*>::iterator iterator; | |
22 | |
23 // Returns the singleton instance. | |
24 static AppModalDialogQueue* GetInstance(); | |
25 | |
26 // Adds a modal dialog to the queue. If there are no other dialogs in the | |
27 // queue, the dialog will be shown immediately. Once it is shown, the | |
28 // most recently active browser window (or whichever is currently active) | |
29 // will be app modal, meaning it will be activated if the user tries to | |
30 // activate any other browser windows. | |
31 // Note: The AppModalDialog |dialog| must be window modal before it | |
32 // can be added as app modal. | |
33 void AddDialog(AppModalDialog* dialog); | |
34 | |
35 // Removes the current dialog in the queue (the one that is being shown). | |
36 // Shows the next dialog in the queue, if any is present. This does not | |
37 // ensure that the currently showing dialog is closed, it just makes it no | |
38 // longer app modal. | |
39 void ShowNextDialog(); | |
40 | |
41 // Activates and shows the current dialog, if the user clicks on one of the | |
42 // windows disabled by the presence of an app modal dialog. This forces | |
43 // the window to be visible on the display even if desktop manager software | |
44 // opened the dialog on another virtual desktop. Assumes there is currently a | |
45 // dialog being shown. (Call BrowserList::IsShowingAppModalDialog to test | |
46 // this condition). | |
47 void ActivateModalDialog(); | |
48 | |
49 // Returns true if there is currently an active app modal dialog box. | |
50 bool HasActiveDialog() const; | |
51 | |
52 AppModalDialog* active_dialog() { return active_dialog_; } | |
53 | |
54 // Iterators to walk the queue. The queue does not include the currently | |
55 // active app modal dialog box. | |
56 iterator begin() { return app_modal_dialog_queue_.begin(); } | |
57 iterator end() { return app_modal_dialog_queue_.end(); } | |
58 | |
59 private: | |
60 friend struct DefaultSingletonTraits<AppModalDialogQueue>; | |
61 | |
62 AppModalDialogQueue(); | |
63 ~AppModalDialogQueue(); | |
64 | |
65 // Shows |dialog| and notifies the BrowserList that a modal dialog is showing. | |
66 void ShowModalDialog(AppModalDialog* dialog); | |
67 | |
68 // Returns the next dialog to show. This removes entries from | |
69 // app_modal_dialog_queue_ until one is valid or the queue is empty. This | |
70 // returns NULL if there are no more dialogs, or all the dialogs in the queue | |
71 // are not valid. | |
72 AppModalDialog* GetNextDialog(); | |
73 | |
74 // Contains all app modal dialogs which are waiting to be shown. The currently | |
75 // active modal dialog is not included. | |
76 std::deque<AppModalDialog*> app_modal_dialog_queue_; | |
77 | |
78 // The currently active app-modal dialog box's delegate. NULL if there is no | |
79 // active app-modal dialog box. | |
80 AppModalDialog* active_dialog_; | |
81 | |
82 // Stores if |ShowModalDialog()| is currently being called on an app-modal | |
83 // dialog. | |
84 bool showing_modal_dialog_; | |
85 | |
86 DISALLOW_COPY_AND_ASSIGN(AppModalDialogQueue); | |
87 }; | |
88 | |
89 #endif // COMPONENTS_APP_MODAL_DIALOGS_APP_MODAL_DIALOG_QUEUE_H_ | |
OLD | NEW |