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