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_export.h" 18 #include "ui/events/event_constants.h" 19 #include "ui/events/keycodes/keyboard_codes.h" 20 21 namespace ui { 22 23 class 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. 27 class UI_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 58 // Returns a string with the localized shortcut if any. 59 base::string16 GetShortcutText() const; 60 61 void set_platform_accelerator(scoped_ptr<PlatformAccelerator> p) { 62 platform_accelerator_ = p.Pass(); 63 } 64 65 // This class keeps ownership of the returned object. 66 const PlatformAccelerator* platform_accelerator() const { 67 return platform_accelerator_.get(); 68 } 69 70 71 protected: 72 // The keycode (VK_...). 73 KeyboardCode key_code_; 74 75 // The event type (usually ui::ET_KEY_PRESSED). 76 EventType type_; 77 78 // The state of the Shift/Ctrl/Alt keys. 79 int modifiers_; 80 81 // Stores platform specific data. May be NULL. 82 scoped_ptr<PlatformAccelerator> platform_accelerator_; 83 }; 84 85 // An interface that classes that want to register for keyboard accelerators 86 // should implement. 87 class UI_EXPORT AcceleratorTarget { 88 public: 89 // Should return true if the accelerator was processed. 90 virtual bool AcceleratorPressed(const Accelerator& accelerator) = 0; 91 92 // Should return true if the target can handle the accelerator events. The 93 // AcceleratorPressed method is invoked only for targets for which 94 // CanHandleAccelerators returns true. 95 virtual bool CanHandleAccelerators() const = 0; 96 97 protected: 98 virtual ~AcceleratorTarget() {} 99 }; 100 101 // Since accelerator code is one of the few things that can't be cross platform 102 // in the chrome UI, separate out just the GetAcceleratorForCommandId() from 103 // the menu delegates. 104 class AcceleratorProvider { 105 public: 106 // Gets the accelerator for the specified command id. Returns true if the 107 // command id has a valid accelerator, false otherwise. 108 virtual bool GetAcceleratorForCommandId(int command_id, 109 ui::Accelerator* accelerator) = 0; 110 111 protected: 112 virtual ~AcceleratorProvider() {} 113 }; 114 115 } // namespace ui 116 117 #endif // UI_BASE_ACCELERATORS_ACCELERATOR_H_ 118