15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_APP_MODAL_DIALOGS_APP_MODAL_DIALOG_QUEUE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_APP_MODAL_DIALOGS_APP_MODAL_DIALOG_QUEUE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppModalDialog; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> struct DefaultSingletonTraits; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keeps a queue of AppModalDialogs, making sure only one app modal 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dialog is shown at a time. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is a singleton. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppModalDialogQueue { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::deque<AppModalDialog*>::iterator iterator; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the singleton instance. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AppModalDialogQueue* GetInstance(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a modal dialog to the queue. If there are no other dialogs in the 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // queue, the dialog will be shown immediately. Once it is shown, the 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // most recently active browser window (or whichever is currently active) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be app modal, meaning it will be activated if the user tries to 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // activate any other browser windows. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: The AppModalDialog |dialog| must be window modal before it 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be added as app modal. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddDialog(AppModalDialog* dialog); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes the current dialog in the queue (the one that is being shown). 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the next dialog in the queue, if any is present. This does not 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ensure that the currently showing dialog is closed, it just makes it no 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // longer app modal. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowNextDialog(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activates and shows the current dialog, if the user clicks on one of the 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // windows disabled by the presence of an app modal dialog. This forces 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window to be visible on the display even if desktop manager software 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opened the dialog on another virtual desktop. Assumes there is currently a 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dialog being shown. (Call BrowserList::IsShowingAppModalDialog to test 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this condition). 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ActivateModalDialog(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if there is currently an active app modal dialog box. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasActiveDialog() const; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppModalDialog* active_dialog() { return active_dialog_; } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators to walk the queue. The queue does not include the currently 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active app modal dialog box. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator begin() { return app_modal_dialog_queue_.begin(); } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator end() { return app_modal_dialog_queue_.end(); } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<AppModalDialogQueue>; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppModalDialogQueue(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~AppModalDialogQueue(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows |dialog| and notifies the BrowserList that a modal dialog is showing. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowModalDialog(AppModalDialog* dialog); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the next dialog to show. This removes entries from 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app_modal_dialog_queue_ until one is valid or the queue is empty. This 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns NULL if there are no more dialogs, or all the dialogs in the queue 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not valid. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppModalDialog* GetNextDialog(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Contains all app modal dialogs which are waiting to be shown. The currently 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active modal dialog is not included. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<AppModalDialog*> app_modal_dialog_queue_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The currently active app-modal dialog box's delegate. NULL if there is no 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active app-modal dialog box. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppModalDialog* active_dialog_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stores if |ShowModalDialog()| is currently being called on an app-modal 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dialog. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool showing_modal_dialog_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AppModalDialogQueue); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_APP_MODAL_DIALOGS_APP_MODAL_DIALOG_QUEUE_H_ 90