accelerator.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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