1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// This class describe a keyboard accelerator (or keyboard shortcut). 6// Keyboard accelerators are registered with the FocusManager. 7// It has a copy constructor and assignment operator so that it can be copied. 8// It also defines the < operator so that it can be used as a key in a std::map. 9// 10 11#ifndef UI_BASE_ACCELERATORS_ACCELERATOR_H_ 12#define UI_BASE_ACCELERATORS_ACCELERATOR_H_ 13 14#include "base/memory/scoped_ptr.h" 15#include "base/strings/string16.h" 16#include "ui/base/accelerators/platform_accelerator.h" 17#include "ui/base/ui_base_export.h" 18#include "ui/events/event_constants.h" 19#include "ui/events/keycodes/keyboard_codes.h" 20 21namespace ui { 22 23class PlatformAccelerator; 24 25// This is a cross-platform class for accelerator keys used in menus. 26// |platform_accelerator| should be used to store platform specific data. 27class UI_BASE_EXPORT Accelerator { 28 public: 29 Accelerator(); 30 Accelerator(ui::KeyboardCode keycode, int modifiers); 31 Accelerator(const Accelerator& accelerator); 32 ~Accelerator(); 33 34 Accelerator& operator=(const Accelerator& accelerator); 35 36 // Define the < operator so that the KeyboardShortcut can be used as a key in 37 // a std::map. 38 bool operator <(const Accelerator& rhs) const; 39 40 bool operator ==(const Accelerator& rhs) const; 41 42 bool operator !=(const Accelerator& rhs) const; 43 44 ui::KeyboardCode key_code() const { return key_code_; } 45 46 // Sets the event type if the accelerator should be processed on an event 47 // other than ui::ET_KEY_PRESSED. 48 void set_type(ui::EventType type) { type_ = type; } 49 ui::EventType type() const { return type_; } 50 51 int modifiers() const { return modifiers_; } 52 53 bool IsShiftDown() const; 54 bool IsCtrlDown() const; 55 bool IsAltDown() const; 56 bool IsCmdDown() const; 57 bool IsRepeat() const; 58 59 // Returns a string with the localized shortcut if any. 60 base::string16 GetShortcutText() const; 61 62 void set_platform_accelerator(scoped_ptr<PlatformAccelerator> p) { 63 platform_accelerator_ = p.Pass(); 64 } 65 66 // This class keeps ownership of the returned object. 67 const PlatformAccelerator* platform_accelerator() const { 68 return platform_accelerator_.get(); 69 } 70 71 void set_is_repeat(bool is_repeat) { is_repeat_ = is_repeat; } 72 73 protected: 74 // The keycode (VK_...). 75 KeyboardCode key_code_; 76 77 // The event type (usually ui::ET_KEY_PRESSED). 78 EventType type_; 79 80 // The state of the Shift/Ctrl/Alt keys. 81 int modifiers_; 82 83 // True if the accelerator is created for an auto repeated key event. 84 bool is_repeat_; 85 86 // Stores platform specific data. May be NULL. 87 scoped_ptr<PlatformAccelerator> platform_accelerator_; 88}; 89 90// An interface that classes that want to register for keyboard accelerators 91// should implement. 92class UI_BASE_EXPORT AcceleratorTarget { 93 public: 94 // Should return true if the accelerator was processed. 95 virtual bool AcceleratorPressed(const Accelerator& accelerator) = 0; 96 97 // Should return true if the target can handle the accelerator events. The 98 // AcceleratorPressed method is invoked only for targets for which 99 // CanHandleAccelerators returns true. 100 virtual bool CanHandleAccelerators() const = 0; 101 102 protected: 103 virtual ~AcceleratorTarget() {} 104}; 105 106// Since accelerator code is one of the few things that can't be cross platform 107// in the chrome UI, separate out just the GetAcceleratorForCommandId() from 108// the menu delegates. 109class AcceleratorProvider { 110 public: 111 // Gets the accelerator for the specified command id. Returns true if the 112 // command id has a valid accelerator, false otherwise. 113 virtual bool GetAcceleratorForCommandId(int command_id, 114 ui::Accelerator* accelerator) = 0; 115 116 protected: 117 virtual ~AcceleratorProvider() {} 118}; 119 120} // namespace ui 121 122#endif // UI_BASE_ACCELERATORS_ACCELERATOR_H_ 123