1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/fading_controls.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/stl_util.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/draw_utils.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/resource_consts.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/input_event.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chrome_pdf { 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kFadingAlphaShift = 64; 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kSplashFadingAlphaShift = 16; 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FadingControls::FadingControls() 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : state_(NONE), current_transparency_(kOpaqueAlpha), fading_timer_id_(0), 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_capture_control_(kInvalidControlId), 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fading_timeout_(kFadingTimeoutMs), alpha_shift_(kFadingAlphaShift), 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) splash_(false), splash_timeout_(0) { 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FadingControls::~FadingControls() { 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) STLDeleteElements(&controls_); 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool FadingControls::CreateFadingControls( 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 id, const pp::Rect& rc, bool visible, 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Control::Owner* owner, uint8 transparency) { 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_transparency_ = transparency; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return Control::Create(id, rc, visible, owner); 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::Paint(pp::ImageData* image_data, const pp::Rect& rc) { 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // When this control is set to invisible the individual controls are not. 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // So we need to check for visible() here. 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!visible()) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*iter)->Paint(image_data, rc); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool FadingControls::HandleEvent(const pp::InputEvent& event) { 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!visible()) 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent mouse_event(event); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (mouse_event.is_null()) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NotifyControls(event); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point pt = mouse_event.GetPosition(); 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_mouse_click = 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetType() == PP_INPUTEVENT_TYPE_MOUSEDOWN || 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetType() == PP_INPUTEVENT_TYPE_MOUSEUP; 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (rect().Contains(pt)) { 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CancelSplashMode(); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FadeIn(); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Eat mouse click if are invisible or just fading in. 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // That prevents accidental clicks on the controls for touch devices. 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool eat_mouse_click = 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (state_ == FADING_IN || current_transparency_ == kTransparentAlpha); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (eat_mouse_click && is_mouse_click && 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_LEFT) 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; // Eat this event here. 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((!rect().Contains(pt)) || 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetType() == PP_INPUTEVENT_TYPE_MOUSELEAVE) { 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!splash_) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FadeOut(); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent event_leave(pp::MouseInputEvent( 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) owner()->GetInstance(), 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_INPUTEVENT_TYPE_MOUSELEAVE, 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetTimeStamp(), 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetModifiers(), 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetButton(), 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetPosition(), 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetClickCount(), 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetMovement())); 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NotifyControls(event_leave); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NotifyControls(event); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::OnTimerFired(uint32 timer_id) { 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (timer_id == fading_timer_id_) { 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 current_alpha = static_cast<int32>(current_transparency_); 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (state_ == FADING_IN) 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_alpha += alpha_shift_; 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else if (state_ == FADING_OUT) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_alpha -= alpha_shift_; 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_alpha >= kOpaqueAlpha) { 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state_ = NONE; 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_alpha = kOpaqueAlpha; 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (current_alpha <= kTransparentAlpha) { 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state_ = NONE; 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_alpha = kTransparentAlpha; 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_transparency_ = static_cast<uint8>(current_alpha); 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Invalidate controls with new alpha transparency. 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We are going to invalidate the whole FadingControls area, to 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // allow simultaneous drawing. 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*iter)->AdjustTransparency(current_transparency_, false); 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) owner()->Invalidate(id(), GetControlsRect()); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (state_ != NONE) // Fading still in progress. 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fading_timer_id_ = owner()->ScheduleTimer(id(), fading_timeout_); 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnFadingComplete(); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Dispatch timer to controls. 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*iter)->OnTimerFired(timer_id); 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::EventCaptureReleased() { 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_capture_control_ != kInvalidControlId) { 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Remove previous catpure. 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Control* ctrl = GetControl(current_capture_control_); 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (ctrl) 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl->EventCaptureReleased(); 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::MoveBy(const pp::Point& offset, bool invalidate) { 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We invalidate entire FadingControl later if needed. 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*iter)->MoveBy(offset, false); 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Control::MoveBy(offset, invalidate); 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::OnEvent(uint32 control_id, uint32 event_id, void* data) { 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) owner()->OnEvent(control_id, event_id, data); 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::Invalidate(uint32 control_id, const pp::Rect& rc) { 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) owner()->Invalidate(control_id, rc); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)uint32 FadingControls::ScheduleTimer(uint32 control_id, uint32 timeout_ms) { 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(gene): implement timer routine properly. 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTIMPLEMENTED(); 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) //owner()->ScheduleTimer(control_id); 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::SetEventCapture(uint32 control_id, bool set_capture) { 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (control_id == current_capture_control_) { 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!set_capture) // Remove event capture. 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_capture_control_ = kInvalidControlId; 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventCaptureReleased(); 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_capture_control_ = control_id; 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::SetCursor(uint32 control_id, 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_CursorType_Dev cursor_type) { 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) owner()->SetCursor(control_id, cursor_type); 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Instance* FadingControls::GetInstance() { 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return owner()->GetInstance(); 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool FadingControls::AddControl(Control* control) { 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(control); 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (control->owner() != this) 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!rect().Contains(control->rect())) 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control->AdjustTransparency(current_transparency_, false); 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controls_.push_back(control); 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::RemoveControl(uint32 control_id) { 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_capture_control_ == control_id) { 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_capture_control_ = kInvalidControlId; 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((*iter)->id() == control_id) { 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete (*iter); 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controls_.erase(iter); 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Control* FadingControls::GetControl(uint32 id) { 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((*iter)->id() == id) 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return *iter; 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Rect FadingControls::GetControlsRect() { 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc; 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rc = rc.Union((*iter)->rect()); 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return rc; 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool FadingControls::ExpandLeft(int offset) { 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc = rect(); 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rc.set_width(rc.width() + offset); 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rc.set_x(rc.x() - offset); 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!rc.Contains(GetControlsRect())) 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // No need to invalidate since we are expanding triggering area only. 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetRect(rc, false); 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::Splash(uint32 time_ms) { 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) splash_ = true; 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) splash_timeout_ = time_ms; 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) alpha_shift_ = kSplashFadingAlphaShift; 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FadeIn(); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool FadingControls::NotifyControls(const pp::InputEvent& event) { 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // First pass event to a control that current capture is set to. 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Control* ctrl = GetControl(current_capture_control_); 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (ctrl) { 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (ctrl->HandleEvent(event)) 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Control*>::iterator iter; 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = controls_.begin(); iter != controls_.end(); ++iter) { 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Now pass event to all control except control with capture, 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // since we already passed to it above. 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((*iter) != ctrl && (*iter)->HandleEvent(event)) 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::FadeIn() { 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool already_visible = 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (state_ == NONE && current_transparency_ == kOpaqueAlpha); 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (state_ != FADING_IN && !already_visible) { 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state_ = FADING_IN; 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fading_timer_id_ = owner()->ScheduleTimer(id(), fading_timeout_); 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (already_visible) 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnFadingComplete(); 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::FadeOut() { 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool already_invisible = 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (state_ == NONE && current_transparency_ == kTransparentAlpha); 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (state_ != FADING_OUT && !already_invisible) { 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state_ = FADING_OUT; 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fading_timer_id_ = owner()->ScheduleTimer(id(), fading_timeout_); 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (already_invisible) 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnFadingComplete(); 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::OnFadingComplete() { 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(current_transparency_ == kOpaqueAlpha || 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_transparency_ == kTransparentAlpha); 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // In the splash mode following states are possible: 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Fade-in complete: splash_==true, splash_timeout_ != 0 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We need to schedule timer for splash_timeout_. 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Splash timeout complete: splash_==true, splash_timeout_ == 0 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We need to fade out still using splash settings. 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Fade-out complete: current_transparency_ == kTransparentAlpha 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We need to cancel splash mode and go back to normal settings. 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (splash_) { 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_transparency_ == kOpaqueAlpha) { 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (splash_timeout_) { 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fading_timer_id_ = owner()->ScheduleTimer(id(), splash_timeout_); 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) splash_timeout_ = 0; 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FadeOut(); 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CancelSplashMode(); 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControls::CancelSplashMode() { 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) splash_ = false; 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) alpha_shift_ = kFadingAlphaShift; 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace chrome_pdf 317