15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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_GTK_GLOBAL_HISTORY_MENU_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_GTK_GLOBAL_HISTORY_MENU_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/common/cancelable_request.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/global_menu_owner.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gtk/gtk_signal.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TopSites; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _GdkPixbuf GdkPixbuf; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Controls the History menu. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GlobalHistoryMenu : public GlobalMenuOwner, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public TabRestoreServiceObserver { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit GlobalHistoryMenu(Browser* browser); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~GlobalHistoryMenu(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes the history menu we need to modify based on the tab restore/most 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visited state. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Init(GtkWidget* history_menu, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* history_menu_item) OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class HistoryItem; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ClearMenuClosure; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct GetIndexClosure; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<GtkWidget*, HistoryItem*> MenuItemToHistoryMap; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends a message off to History for data. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetTopSitesData(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback to receive data requested from GetTopSitesData(). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnTopSitesReceived(const history::MostVisitedURLList& visited_list); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the currently existing HistoryItem associated with 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |menu_item|. Can return NULL. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryItem* HistoryItemForMenuItem(GtkWidget* menu_item); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether there's a valid HistoryItem representation of |entry|. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasValidHistoryItemForTab(const TabRestoreService::Tab& entry); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a HistoryItem from the data in |entry|. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryItem* HistoryItemForTab(const TabRestoreService::Tab& entry); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a menu item form |item| and inserts it in |menu| at |index|. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* AddHistoryItemToMenu(HistoryItem* item, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* menu, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tag, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the first index of the item in |menu| with the tag |tag_id|. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetIndexOfMenuItemWithTag(GtkWidget* menu, int tag_id); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will remove all menu items in |menu| with |tag| as their tag. This 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clears state about HistoryItems* that we keep to prevent that data from 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // going stale. That's why this method recurses into its child menus. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearMenuSection(GtkWidget* menu, int tag); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implementation detail of GetIndexOfMenuItemWithTag. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void GetIndexCallback(GtkWidget* widget, GetIndexClosure* closure); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implementation detail of ClearMenuSection. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ClearMenuCallback(GtkWidget* widget, ClearMenuClosure* closure); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For TabRestoreServiceObserver 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHROMEGTK_CALLBACK_0(GlobalHistoryMenu, void, OnRecentlyClosedItemActivated); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for the first menu show command so we can then connect to the 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabRestoreService. With how the global menus work, I'd prefer to register 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the TabRestoreService as soon as we're constructed, but this breaks 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unit tests which test the service (because they force different 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // construction ordering while us connecting to the TabRestoreService loads 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data now!) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHROMEGTK_CALLBACK_0(GlobalHistoryMenu, void, OnMenuActivate); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The history menu. We keep this since we need to rewrite parts of it 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // periodically. 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GtkWidget* history_menu_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::TopSites* top_sites_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For callbacks may be run after destruction. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<GlobalHistoryMenu> weak_ptr_factory_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreService* tab_restore_service_; // weak 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A mapping from GtkMenuItems to HistoryItems that maintain data. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuItemToHistoryMap menu_item_history_map_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_GTK_GLOBAL_HISTORY_MENU_H_ 125