/* * Copyright (c) 2005-2010, Haiku, Inc. * Distributed under the terms of the MIT license. * * Author: * DarkWyrm */ #include "InlineEditor.h" #include #include class EditFilter : public BMessageFilter { public: EditFilter(BTextControl *textbox) : BMessageFilter(B_PROGRAMMED_DELIVERY, B_ANY_SOURCE, B_KEY_DOWN) { fTextBox = textbox; } ~EditFilter(void) { } filter_result Filter(BMessage *msg, BHandler **target) { int32 rawchar; msg->FindInt32("raw_char", &rawchar); if (rawchar == B_ESCAPE) { BLooper *loop = (*target)->Looper(); if (loop) { BMessenger msgr(loop); msgr.SendMessage(B_QUIT_REQUESTED); return B_SKIP_MESSAGE; } } else if (rawchar == B_ENTER) { fTextBox->Invoke(); return B_SKIP_MESSAGE; } return B_DISPATCH_MESSAGE; } private: BTextControl *fTextBox; }; InlineEditor::InlineEditor(BMessenger target, const BRect &frame, const char *text) : BWindow(frame, "InlineEditor", B_NO_BORDER_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS), fMessenger(target), fCommand(M_INLINE_TEXT) { fTextBox = new BTextControl(BRect(0, 0, 1, 1), "inlinebox", NULL, text, new BMessage(fCommand), B_FOLLOW_ALL, B_WILL_DRAW); AddChild(fTextBox); fTextBox->SetDivider(0); fTextBox->MakeFocus(true); fTextBox->ResizeToPreferred(); fTextBox->ResizeTo(Bounds().Width(), fTextBox->Bounds().Height()); ResizeTo(Bounds().Width(), fTextBox->Bounds().Height()); AddCommonFilter(new EditFilter(fTextBox)); } bool InlineEditor::QuitRequested(void) { return true; } void InlineEditor::SetMessage(BMessage *msg) { fCommand = msg ? msg->what : 0; fTextBox->SetMessage(msg); } void InlineEditor::MessageReceived(BMessage *msg) { if (msg->what == fCommand) { fMessenger.SendMessage(msg); PostMessage(B_QUIT_REQUESTED); } } void InlineEditor::WindowActivated(bool active) { if (!active) PostMessage(B_QUIT_REQUESTED); }