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