xref: /haiku/src/preferences/keymap/KeyboardLayoutView.h (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /*
2  * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
3  * Copyright 2013-2014 Haiku, Inc. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  *
6  * Authors:
7  *		Axel Dörfler, axeld@pinc-software.de
8  *		John Scipione, jscipione@gmail.com
9  */
10 #ifndef KEYBOARD_LAYOUT_VIEW_H
11 #define KEYBOARD_LAYOUT_VIEW_H
12 
13 
14 #include <Messenger.h>
15 #include <View.h>
16 
17 #include "KeyboardLayout.h"
18 
19 
20 class BInputServerDevice;
21 class BMenuItem;
22 class Keymap;
23 
24 
25 class KeyboardLayoutView : public BView {
26 public:
27 								KeyboardLayoutView(const char* name,
28 									BInputServerDevice* dev = NULL);
29 								~KeyboardLayoutView();
30 
31 			void				SetKeyboardLayout(KeyboardLayout* layout);
32 			void				SetKeymap(Keymap* keymap);
33 			void				SetTarget(BMessenger target);
34 
35 			KeyboardLayout*		GetKeyboardLayout() { return fLayout; }
36 
37 			void				SetBaseFont(const BFont& font);
38 
39 			void				SetEditable(bool editable);
40 
41 protected:
42 	virtual void				AttachedToWindow();
43 	virtual void				FrameResized(float width, float height);
44 	virtual BSize				MinSize();
45 
46 	virtual void				KeyDown(const char* bytes, int32 numBytes);
47 	virtual void				KeyUp(const char* bytes, int32 numBytes);
48 	virtual void				MouseDown(BPoint point);
49 	virtual void				MouseUp(BPoint point);
50 	virtual void				MouseMoved(BPoint point, uint32 transit,
51 									const BMessage* dragMessage);
52 
53 	virtual void				Draw(BRect updateRect);
54 	virtual void				MessageReceived(BMessage* message);
55 	virtual void				WindowActivated(bool active);
56 
57 private:
58 			enum key_kind {
59 				kNormalKey,
60 				kSpecialKey,
61 				kSymbolKey,
62 				kIndicator
63 			};
64 
65 			void				_LayoutKeyboard();
66 			void				_DrawKeyButton(BView* view, BRect& rect,
67 									BRect updateRect, rgb_color base,
68 									rgb_color background, bool pressed);
69 			void				_DrawKey(BView* view, BRect updateRect,
70 									const Key* key, BRect frame, bool pressed);
71 			void				_DrawIndicator(BView* view, BRect updateRect,
72 									const Indicator* indicator, BRect rect,
73 									bool lit);
74 			const char*			_SpecialKeyLabel(const key_map& map,
75 									uint32 code, bool abbreviated = false);
76 			const char*			_SpecialMappedKeySymbol(const char* bytes,
77 									size_t numBytes);
78 			const char*			_SpecialMappedKeyLabel(const char* bytes,
79 									size_t numBytes, bool abbreviated = false);
80 			bool				_FunctionKeyLabel(uint32 code, char* text,
81 									size_t textSize);
82 			void				_GetAbbreviatedKeyLabelIfNeeded(BView* view,
83 									BRect rect, const Key* key, char* text,
84 									size_t textSize);
85 			void				_GetKeyLabel(const Key* key, char* text,
86 									size_t textSize, key_kind& keyKind);
87 			bool				_IsKeyPressed(uint32 code);
88 			bool				_KeyState(uint32 code) const;
89 			void				_SetKeyState(uint32 code, bool pressed);
90 			Key*				_KeyForCode(uint32 code);
91 			void				_InvalidateKey(uint32 code);
92 			void				_InvalidateKey(const Key* key);
93 			bool				_HandleDeadKey(uint32 key, int32 modifiers);
94 			void				_KeyChanged(const BMessage* message);
95 			Key*				_KeyAt(BPoint point);
96 			BRect				_FrameFor(BRect keyFrame);
97 			BRect				_FrameFor(const Key* key);
98 			void				_SetFontSize(BView* view, key_kind keyKind);
99 			void				_EvaluateDropTarget(BPoint point);
100 			void				_SendKeyDown(const Key* key);
101 
102 			BMenuItem*			_CreateSwapModifiersMenuItem(uint32 modifier,
103 									uint32 displayModifier, uint32 oldCode,
104 									uint32 newCode);
105 			const char*			_NameForModifier(uint32 modifier, bool pretty);
106 
107 			KeyboardLayout*		fLayout;
108 			Keymap*				fKeymap;
109 			BMessenger			fTarget;
110 			bool				fEditable;
111 
112 			uint8				fKeyState[16];
113 			int32				fModifiers;
114 			int32				fDeadKey;
115 			int32				fButtons;
116 
117 			BPoint				fClickPoint;
118 			Key*				fDragKey;
119 			int32				fDragModifiers;
120 			Key*				fDropTarget;
121 			BPoint				fDropPoint;
122 
123 			BSize				fOldSize;
124 			BFont				fBaseFont;
125 			BFont				fSpecialFont;
126 			float				fBaseFontHeight;
127 			float				fBaseFontSize;
128 			BPoint				fOffset;
129 			float				fFactor;
130 			float				fGap;
131 
132 			BInputServerDevice*	fDevice;
133 };
134 
135 
136 #endif	// KEYBOARD_LAYOUT_VIEW_H
137