1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 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) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_OBSERVER_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_OBSERVER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ContextMenuParams; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The interface used for implementing context-menu items. The following 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instruction describe how to implement a context-menu item with this 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interface. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. Add command IDs for the context-menu items to 'chrome_command_ids.h'. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define IDC_MY_COMMAND 99999 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. Add strings for the context-menu items to 'generated_sources.grd'. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <message name="IDS_MY_COMMAND" desc="..."> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// My command 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// </message> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3. Create a class that implements this interface. (It is a good idea to use 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RenderViewContextMenuDelegate interface to avoid accessing the 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderViewContextMenu class directly.) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class MyMenuObserver : public RenderViewContextMenuObserver { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MyMenuObserver(RenderViewContextMenuDelegate* d); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~MyMenuObserver(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// virtual void InitMenu(const content::ContextMenuParams& params) OVERRIDE; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// virtual bool IsCommandIdSupported(int command_id) OVERRIDE; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// virtual bool IsCommandIdEnabled(int command_id) OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// virtual void ExecuteCommand(int command_id) OVERRIDE; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// private: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderViewContextMenuDelgate* delegate_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void MyMenuObserver::InitMenu(const content::ContextMenuParams& params) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate_->AddMenuItem(IDC_MY_COMMAND,...); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool MyMenuObserver::IsCommandIdSupported(int command_id) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return command_id == IDC_MY_COMMAND; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool MyMenuObserver::IsCommandIdEnabled(int command_id) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DCHECK(command_id == IDC_MY_COMMAND); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return true; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void MyMenuObserver::ExecuteCommand(int command_id) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DCHECK(command_id == IDC_MY_COMMAND); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4. Add this observer class to the RenderViewContextMenu class. (It is good 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to use scoped_ptr<> so Chrome can create its instances only when it needs.) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class RenderViewContextMenu { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// private: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scoped_ptr<MyMenuObserver> my_menu_observer_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5. Create its instance in InitMenu() and add it to the observer list of the 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderViewContextMenu class. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void RenderViewContextMenu::InitMenu() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// my_menu_observer_.reset(new MyMenuObserver(this)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// observers_.AddObserver(my_menu_observer_.get()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewContextMenuObserver { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RenderViewContextMenuObserver() {} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the RenderViewContextMenu class initializes a context menu. We 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // usually call RenderViewContextMenuDelegate::AddMenuItem() to add menu items 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in this function. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitMenu(const content::ContextMenuParams& params); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the RenderViewContextMenu class asks whether an observer 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // listens for the specified command ID. If this function returns true, the 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewContextMenu class calls IsCommandIdEnabled() or ExecuteCommand(). 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsCommandIdSupported(int command_id); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the RenderViewContextMenu class sets the initial status of the 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified context-menu item. If we need to enable or disable a context-menu 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item while showing, use RenderViewContextMenuDelegate::UpdateMenuItem(). 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsCommandIdChecked(int command_id); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsCommandIdEnabled(int command_id); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a user selects the specified context-menu item. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExecuteCommand(int command_id); 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Called when a user closes the context menu without selecting any items. 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnMenuCancel(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // CHROME_BROWSER_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_OBSERVER_H_ 108