// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // For print preview, a print preview (PP) tab is linked with the initiator tab // that initiated the printing operation. If the tab initiates a second // printing operation while the first print preview tab is still open, that PP // tab is focused/activated. There may be more than one PP tab open. There is a // 1:1 relationship between PP tabs and initiating tabs. This class manages PP // tabs and initiator tabs. #ifndef CHROME_BROWSER_PRINTING_PRINT_PREVIEW_TAB_CONTROLLER_H_ #define CHROME_BROWSER_PRINTING_PRINT_PREVIEW_TAB_CONTROLLER_H_ #pragma once #include <map> #include "base/memory/ref_counted.h" #include "chrome/browser/sessions/session_id.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" class Browser; class TabContents; namespace printing { class PrintPreviewTabController : public base::RefCounted<PrintPreviewTabController>, public NotificationObserver { public: PrintPreviewTabController(); virtual ~PrintPreviewTabController(); static PrintPreviewTabController* GetInstance(); // Initiate print preview for |initiator_tab|. // Call this instead of GetOrCreatePreviewTab(). static void PrintPreview(TabContents* initiator_tab); // Get/Create the print preview tab for |initiator_tab|. // Exposed for unit tests. TabContents* GetOrCreatePreviewTab(TabContents* initiator_tab); // Returns preview tab for |tab|. // Returns |tab| if |tab| is a preview tab. // Returns NULL if no preview tab exists for |tab|. TabContents* GetPrintPreviewForTab(TabContents* tab) const; // Returns initiator tab for |preview_tab|. // Returns NULL if no initiator tab exists for |preview_tab|. TabContents* GetInitiatorTab(TabContents* preview_tab); // Notification observer implementation. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // Returns true if |tab| is a print preview tab. static bool IsPrintPreviewTab(TabContents* tab); private: friend class base::RefCounted<PrintPreviewTabController>; // 1:1 relationship between initiator tab and print preview tab. // Key: Preview tab. // Value: Initiator tab. typedef std::map<TabContents*, TabContents*> PrintPreviewTabMap; // Creates a new print preview tab. TabContents* CreatePrintPreviewTab(TabContents* initiator_tab); // Adds/Removes observers for notifications from |tab|. void AddObservers(TabContents* tab); void RemoveObservers(TabContents* tab); PrintPreviewTabMap preview_tab_map_; // A registrar for listening notifications. NotificationRegistrar registrar_; // True if the controller is waiting for a new preview tab via // NavigationType::NEW_PAGE. bool waiting_for_new_preview_page_; DISALLOW_COPY_AND_ASSIGN(PrintPreviewTabController); }; } // namespace printing #endif // CHROME_BROWSER_PRINTING_PRINT_PREVIEW_TAB_CONTROLLER_H_