1// Panel.cpp 2 3#include <stdio.h> 4 5#include <InterfaceDefs.h> 6#include <Message.h> 7#include <MessageFilter.h> 8 9#include "Panel.h" 10 11class EscapeFilter : public BMessageFilter { 12 public: 13 EscapeFilter(Panel* target) 14 : BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE), 15 fPanel(target) 16 { 17 } 18 virtual ~EscapeFilter() 19 { 20 } 21 virtual filter_result Filter(BMessage* message, BHandler** target) 22 { 23 filter_result result = B_DISPATCH_MESSAGE; 24 switch (message->what) { 25 case B_KEY_DOWN: 26 case B_UNMAPPED_KEY_DOWN: { 27 uint32 key; 28 if (message->FindInt32("raw_char", (int32*)&key) >= B_OK) { 29 if (key == B_ESCAPE) { 30 result = B_SKIP_MESSAGE; 31 fPanel->Cancel(); 32 } 33 } 34 break; 35 } 36 default: 37 break; 38 } 39 return result; 40 } 41 private: 42 Panel* fPanel; 43}; 44 45// constructor 46Panel::Panel(BRect frame, const char* title, 47 window_type type, uint32 flags, 48 uint32 workspace) 49 : BWindow(frame, title, type, flags, workspace) 50{ 51 _InstallFilter(); 52} 53 54// constructor 55Panel::Panel(BRect frame, const char* title, 56 window_look look, window_feel feel, 57 uint32 flags, uint32 workspace) 58 : BWindow(frame, title, look, feel, flags, workspace) 59{ 60 _InstallFilter(); 61} 62 63// destructor 64Panel::~Panel() 65{ 66} 67 68// MessageReceived 69void 70Panel::Cancel() 71{ 72 PostMessage(B_QUIT_REQUESTED); 73} 74 75// _InstallFilter 76void 77Panel::_InstallFilter() 78{ 79 AddCommonFilter(new EscapeFilter(this)); 80} 81