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_COMMAND_UPDATER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_COMMAND_UPDATER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandObserver; 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CommandUpdaterDelegate; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CommandUpdater class 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This object manages the enabled state of a set of commands. Observers 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// register to listen to changes in this state so they can update their 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// presentation. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandUpdater { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a CommandUpdater with |delegate| to handle the execution of specific 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // commands. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit CommandUpdater(CommandUpdaterDelegate* delegate); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~CommandUpdater(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the specified command ID is supported. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SupportsCommand(int id) const; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the specified command ID is enabled. The command ID must be 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supported by this updater. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsCommandEnabled(int id) const; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Performs the action associated with this command ID using CURRENT_TAB 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disposition. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the command was executed (i.e. it is supported and is 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled). 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ExecuteCommand(int id); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Performs the action associated with this command ID using the given 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disposition. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the command was executed (i.e. it is supported and is 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled). 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ExecuteCommandWithDisposition(int id, WindowOpenDisposition disposition); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds an observer to the state of a particular command. If the command does 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not exist, it is created, initialized to false. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddCommandObserver(int id, CommandObserver* observer); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes an observer to the state of a particular command. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveCommandObserver(int id, CommandObserver* observer); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes |observer| for all commands on which it's registered. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveCommandObserver(CommandObserver* observer); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all observers of a particular command that the command has been 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled or disabled. If the command does not exist, it is created and 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized to |state|. This function is very lightweight if the command 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state has not changed. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateCommandEnabled(int id, bool state); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A piece of data about a command - whether or not it is enabled, and a list 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of objects that observe the enabled state of this command. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Command; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a Command node for a given command ID, creating an entry if it doesn't 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exist if desired. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Command* GetCommand(int id, bool create); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The delegate is responsible for executing commands. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandUpdaterDelegate* delegate_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a map of command IDs to states and observer lists 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<int, Command*> CommandMap; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandMap commands_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CommandUpdater); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_COMMAND_UPDATER_H_ 85