xref: /haiku/src/apps/resedit/InlineEditor.cpp (revision f2b4344867e97c3f4e742a1b4a15e6879644601a)
1 /*
2  * Copyright (c) 2005-2010, Haiku, Inc.
3  * Distributed under the terms of the MIT license.
4  *
5  * Author:
6  *		DarkWyrm <darkwyrm@gmail.com>
7  */
8 #include "InlineEditor.h"
9 
10 #include <Handler.h>
11 #include <MessageFilter.h>
12 
13 class EditFilter : public BMessageFilter
14 {
15 public:
16 	EditFilter(BTextControl *textbox)
17 		: BMessageFilter(B_PROGRAMMED_DELIVERY, B_ANY_SOURCE, B_KEY_DOWN)
18 	{
19 		fTextBox = textbox;
20 	}
21 
22 	~EditFilter(void)
23 	{
24 	}
25 
26 	filter_result Filter(BMessage *msg, BHandler **target)
27 	{
28 		int32 rawchar;
29 		msg->FindInt32("raw_char", &rawchar);
30 
31 		if (rawchar == B_ESCAPE) {
32 			BLooper *loop = (*target)->Looper();
33 			if (loop) {
34 				BMessenger msgr(loop);
35 				msgr.SendMessage(B_QUIT_REQUESTED);
36 				return B_SKIP_MESSAGE;
37 			}
38 		} else if (rawchar == B_ENTER) {
39 			fTextBox->Invoke();
40 			return B_SKIP_MESSAGE;
41 		}
42 		return B_DISPATCH_MESSAGE;
43 	}
44 
45 private:
46 	BTextControl 	*fTextBox;
47 
48 };
49 
50 InlineEditor::InlineEditor(BMessenger target, const BRect &frame,
51 							const char *text)
52  :	BWindow(frame, "InlineEditor", B_NO_BORDER_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
53  			B_ASYNCHRONOUS_CONTROLS),
54  	fMessenger(target),
55  	fCommand(M_INLINE_TEXT)
56 {
57 	fTextBox = new BTextControl(BRect(0, 0, 1, 1), "inlinebox", NULL, text,
58 								new BMessage(fCommand), B_FOLLOW_ALL, B_WILL_DRAW);
59 	AddChild(fTextBox);
60 	fTextBox->SetDivider(0);
61 	fTextBox->MakeFocus(true);
62 
63 	fTextBox->ResizeToPreferred();
64 	fTextBox->ResizeTo(Bounds().Width(), fTextBox->Bounds().Height());
65 	ResizeTo(Bounds().Width(), fTextBox->Bounds().Height());
66 
67 	AddCommonFilter(new EditFilter(fTextBox));
68 }
69 
70 
71 bool
72 InlineEditor::QuitRequested(void)
73 {
74 	return true;
75 }
76 
77 
78 void
79 InlineEditor::SetMessage(BMessage *msg)
80 {
81 	fCommand = msg ? msg->what : 0;
82 	fTextBox->SetMessage(msg);
83 }
84 
85 
86 void
87 InlineEditor::MessageReceived(BMessage *msg)
88 {
89 	if (msg->what == fCommand) {
90 		fMessenger.SendMessage(msg);
91 		PostMessage(B_QUIT_REQUESTED);
92 	}
93 }
94 
95 void
96 InlineEditor::WindowActivated(bool active)
97 {
98 	if (!active)
99 		PostMessage(B_QUIT_REQUESTED);
100 }
101 
102