xref: /haiku/src/preferences/shortcuts/ShortcutsSpec.h (revision 85892ec52f476b254d75e2bb2e6560e72faa567c)
1 /*
2  * Copyright 1999-2009 Jeremy Friesner
3  * Copyright 2009-2010 Haiku, Inc. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  *
6  * Authors:
7  *		Jeremy Friesner
8  */
9 #ifndef SHORTCUTS_SPEC_H
10 #define SHORTCUTS_SPEC_H
11 
12 
13 #include <Bitmap.h>
14 
15 #include <ColumnListView.h>
16 #include "KeyInfos.h"
17 
18 
19 class CommandActuator;
20 class MetaKeyStateMap;
21 
22 
23 MetaKeyStateMap& GetNthKeyMap(int which);
24 
25 /*
26  * Objects of this class represent one hotkey "entry" in the preferences
27  * ListView. Each ShortcutsSpec contains the info necessary to generate both
28  * the proper GUI display, and the proper BitFieldTester and CommandActuator
29  * object for the ShortcutsCatcher add-on to use.
30  */
31 class ShortcutsSpec : public BRow, public BArchivable {
32 public:
33 	static	void			InitializeMetaMaps();
34 
35 							ShortcutsSpec(const char* command);
36 							ShortcutsSpec(const ShortcutsSpec& copyMe);
37 							ShortcutsSpec(BMessage* from);
38 							~ShortcutsSpec();
39 
40 	virtual	status_t		Archive(BMessage* into, bool deep = true) const;
41 	static	BArchivable*	Instantiate(BMessage* from);
42 	const	char* 			GetCellText(int whichColumn) const;
43 			void			SetCommand(const char* commandStr);
44 
45 	// Returns the name of the Nth Column.
46 	static	const char*		GetColumnName(int index);
47 
48 			// Update this spec's state in response to a keystroke to the given
49 			// column. Returns true iff a change occurred.
50 			bool 			ProcessColumnKeyStroke(int whichColumn,
51 								const char* bytes, int32 key);
52 
53 			// Same as ProcessColumnKeyStroke, but for a mouse click instead.
54 			bool			ProcessColumnMouseClick(int whichColumn);
55 
56 			// Same as ProcessColumnKeyStroke, but for a text string instead.
57 			bool			ProcessColumnTextString(int whichColumn,
58 								const char* string);
59 
60 			int32 			GetSelectedColumn() const { return fSelectedColumn; }
61 			void 			SetSelectedColumn(int32 i) { fSelectedColumn = i; }
62 
63 	// default layout of columns is set in here.
64 	enum {
65 		SHIFT_COLUMN_INDEX		= 0,
66 		CONTROL_COLUMN_INDEX	= 1,
67 		COMMAND_COLUMN_INDEX	= 2,
68 		OPTION_COLUMN_INDEX		= 3,
69 		NUM_META_COLUMNS		= 4, // shift, control, command, option, for now
70 		KEY_COLUMN_INDEX		= NUM_META_COLUMNS,
71 		STRING_COLUMN_INDEX		= 5
72 	};
73 
74 private:
75 			void 			_CacheViewFont(BView* owner);
76 			bool 			_AttemptTabCompletion();
77 
78 			char*			fCommand;
79 			uint32			fCommandLen;	// number of bytes in fCommand buffer
80 			uint32			fCommandNul;	// index of the NUL byte in fCommand
81 
82 			// icon for associated program. Invalid if none available.
83 			BBitmap			fBitmap;
84 
85 			char*			fLastBitmapName;
86 			bool			fBitmapValid;
87 			uint32			fKey;
88 			int32			fMetaCellStateIndex[NUM_META_COLUMNS];
89 			BPoint			fCursorPt1;
90 			BPoint			fCursorPt2;
91 			bool			fCursorPtsValid;
92 	mutable	char			fScratch[50];
93 			int32			fSelectedColumn;
94 
95 private:
96 	static	void			_InitModifierNames();
97 
98 	static	const char*		sShiftName;
99 	static	const char*		sControlName;
100 	static	const char*		sOptionName;
101 	static	const char*		sCommandName;
102 };
103 
104 
105 #endif	// SHORTCUTS_SPEC_H
106