1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #include "SkDisplayEvents.h" 11 #include "SkAnimateMaker.h" 12 #include "SkAnimator.h" 13 #include "SkDisplayEvent.h" 14 #include "SkDisplayMovie.h" 15 #include "SkDrawable.h" 16 #ifdef SK_DEBUG 17 #include "SkDump.h" 18 #endif 19 20 SkEventState::SkEventState() : fCode(0), fDisable(false), fDisplayable(0), fX(0), fY(0) { 21 } 22 23 SkEvents::SkEvents() { 24 } 25 26 SkEvents::~SkEvents() { 27 } 28 29 bool SkEvents::doEvent(SkAnimateMaker& maker, SkDisplayEvent::Kind kind, SkEventState* state) { 30 /*#ifdef SK_DUMP_ENABLED 31 if (maker.fDumpEvents) { 32 SkDebugf("doEvent: "); 33 SkString str; 34 SkDump::GetEnumString(SkType_EventKind, kind, &str); 35 SkDebugf("kind=%s ", str.c_str()); 36 if (state && state->fDisplayable) 37 state->fDisplayable->SkDisplayable::dump(&maker); 38 else 39 SkDebugf("\n"); 40 } 41 #endif*/ 42 bool handled = false; 43 SkDisplayable** firstMovie = maker.fMovies.begin(); 44 SkDisplayable** endMovie = maker.fMovies.end(); 45 for (SkDisplayable** ptr = firstMovie; ptr < endMovie; ptr++) { 46 SkDisplayMovie* movie = (SkDisplayMovie*) *ptr; 47 if (kind != SkDisplayEvent::kOnload) 48 movie->doEvent(kind, state); 49 } 50 SkDisplayable* displayable = state ? state->fDisplayable : NULL; 51 int keyCode = state ? state->fCode : 0; 52 int count = fEvents.count(); 53 for (int index = 0; index < count; index++) { 54 SkDisplayEvent* evt = fEvents[index]; 55 if (evt->disable) 56 continue; 57 if (evt->kind != kind) 58 continue; 59 if (evt->code != (SkKey) -1) { 60 if ((int) evt->code > keyCode || (int) (evt->fMax != (SkKey) -1 ? evt->fMax : evt->code) < keyCode) 61 continue; 62 evt->fLastCode = (SkKey) keyCode; 63 } 64 if (evt->fTarget != NULL && evt->fTarget != displayable) 65 continue; 66 if (state == NULL || state->fDisable == 0) { 67 if (kind >= SkDisplayEvent::kMouseDown && kind <= SkDisplayEvent::kMouseUp) { 68 evt->x = state->fX; 69 evt->y = state->fY; 70 } 71 if (evt->enableEvent(maker)) 72 fError = true; 73 } 74 handled = true; 75 } 76 return handled; 77 } 78 79 #ifdef SK_DUMP_ENABLED 80 void SkEvents::dump(SkAnimateMaker& maker) { 81 int index; 82 SkTDDrawableArray& drawArray = maker.fDisplayList.fDrawList; 83 int count = drawArray.count(); 84 for (index = 0; index < count; index++) { 85 SkDrawable* drawable = drawArray[index]; 86 drawable->dumpEvents(); 87 } 88 count = fEvents.count(); 89 for (index = 0; index < count; index++) { 90 SkDisplayEvent* evt = fEvents[index]; 91 evt->dumpEvent(&maker); 92 } 93 } 94 #endif 95 96 // currently this only removes onLoad events 97 void SkEvents::removeEvent(SkDisplayEvent::Kind kind, SkEventState* state) { 98 int keyCode = state ? state->fCode : 0; 99 SkDisplayable* displayable = state ? state->fDisplayable : NULL; 100 for (SkDisplayEvent** evtPtr = fEvents.begin(); evtPtr < fEvents.end(); evtPtr++) { 101 SkDisplayEvent* evt = *evtPtr; 102 if (evt->kind != kind) 103 continue; 104 if (evt->code != (SkKey) -1) { 105 if ((int) evt->code > keyCode || (int) (evt->fMax != (SkKey) -1 ? evt->fMax : evt->code) < keyCode) 106 continue; 107 } 108 if (evt->fTarget != NULL && evt->fTarget != displayable) 109 continue; 110 int index = fEvents.find(evt); 111 fEvents.remove(index); 112 } 113 } 114