Index: pdf/fading_controls.cc |
=================================================================== |
--- pdf/fading_controls.cc (revision 0) |
+++ pdf/fading_controls.cc (revision 0) |
@@ -0,0 +1,316 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "pdf/fading_controls.h" |
+ |
+#include "base/logging.h" |
+#include "base/stl_util.h" |
+#include "pdf/draw_utils.h" |
+#include "pdf/resource_consts.h" |
+#include "ppapi/cpp/input_event.h" |
+ |
+namespace chrome_pdf { |
+ |
+const uint32 kFadingAlphaShift = 64; |
+const uint32 kSplashFadingAlphaShift = 16; |
+ |
+FadingControls::FadingControls() |
+ : state_(NONE), current_transparency_(kOpaqueAlpha), fading_timer_id_(0), |
+ current_capture_control_(kInvalidControlId), |
+ fading_timeout_(kFadingTimeoutMs), alpha_shift_(kFadingAlphaShift), |
+ splash_(false), splash_timeout_(0) { |
+} |
+ |
+FadingControls::~FadingControls() { |
+ STLDeleteElements(&controls_); |
+} |
+ |
+bool FadingControls::CreateFadingControls( |
+ uint32 id, const pp::Rect& rc, bool visible, |
+ Control::Owner* owner, uint8 transparency) { |
+ current_transparency_ = transparency; |
+ return Control::Create(id, rc, visible, owner); |
+} |
+ |
+void FadingControls::Paint(pp::ImageData* image_data, const pp::Rect& rc) { |
+ // When this control is set to invisible the individual controls are not. |
+ // So we need to check for visible() here. |
+ if (!visible()) |
+ return; |
+ |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ (*iter)->Paint(image_data, rc); |
+ } |
+} |
+ |
+bool FadingControls::HandleEvent(const pp::InputEvent& event) { |
+ if (!visible()) |
+ return false; |
+ |
+ pp::MouseInputEvent mouse_event(event); |
+ if (mouse_event.is_null()) |
+ return NotifyControls(event); |
+ |
+ pp::Point pt = mouse_event.GetPosition(); |
+ |
+ bool is_mouse_click = |
+ mouse_event.GetType() == PP_INPUTEVENT_TYPE_MOUSEDOWN || |
+ mouse_event.GetType() == PP_INPUTEVENT_TYPE_MOUSEUP; |
+ |
+ if (rect().Contains(pt)) { |
+ CancelSplashMode(); |
+ FadeIn(); |
+ |
+ // Eat mouse click if are invisible or just fading in. |
+ // That prevents accidental clicks on the controls for touch devices. |
+ bool eat_mouse_click = |
+ (state_ == FADING_IN || current_transparency_ == kTransparentAlpha); |
+ if (eat_mouse_click && is_mouse_click && |
+ mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_LEFT) |
+ return true; // Eat this event here. |
+ } |
+ |
+ if ((!rect().Contains(pt)) || |
+ event.GetType() == PP_INPUTEVENT_TYPE_MOUSELEAVE) { |
+ if (!splash_) |
+ FadeOut(); |
+ pp::MouseInputEvent event_leave(pp::MouseInputEvent( |
+ owner()->GetInstance(), |
+ PP_INPUTEVENT_TYPE_MOUSELEAVE, |
+ event.GetTimeStamp(), |
+ event.GetModifiers(), |
+ mouse_event.GetButton(), |
+ mouse_event.GetPosition(), |
+ mouse_event.GetClickCount(), |
+ mouse_event.GetMovement())); |
+ return NotifyControls(event_leave); |
+ } |
+ |
+ return NotifyControls(event); |
+} |
+ |
+void FadingControls::OnTimerFired(uint32 timer_id) { |
+ if (timer_id == fading_timer_id_) { |
+ int32 current_alpha = static_cast<int32>(current_transparency_); |
+ if (state_ == FADING_IN) |
+ current_alpha += alpha_shift_; |
+ else if (state_ == FADING_OUT) |
+ current_alpha -= alpha_shift_; |
+ |
+ if (current_alpha >= kOpaqueAlpha) { |
+ state_ = NONE; |
+ current_alpha = kOpaqueAlpha; |
+ } else if (current_alpha <= kTransparentAlpha) { |
+ state_ = NONE; |
+ current_alpha = kTransparentAlpha; |
+ } |
+ current_transparency_ = static_cast<uint8>(current_alpha); |
+ |
+ // Invalidate controls with new alpha transparency. |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ // We are going to invalidate the whole FadingControls area, to |
+ // allow simultaneous drawing. |
+ (*iter)->AdjustTransparency(current_transparency_, false); |
+ } |
+ owner()->Invalidate(id(), GetControlsRect()); |
+ |
+ if (state_ != NONE) // Fading still in progress. |
+ fading_timer_id_ = owner()->ScheduleTimer(id(), fading_timeout_); |
+ else |
+ OnFadingComplete(); |
+ } else { |
+ // Dispatch timer to controls. |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ (*iter)->OnTimerFired(timer_id); |
+ } |
+ } |
+} |
+ |
+void FadingControls::EventCaptureReleased() { |
+ if (current_capture_control_ != kInvalidControlId) { |
+ // Remove previous catpure. |
+ Control* ctrl = GetControl(current_capture_control_); |
+ if (ctrl) |
+ ctrl->EventCaptureReleased(); |
+ } |
+} |
+ |
+void FadingControls::MoveBy(const pp::Point& offset, bool invalidate) { |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ // We invalidate entire FadingControl later if needed. |
+ (*iter)->MoveBy(offset, false); |
+ } |
+ Control::MoveBy(offset, invalidate); |
+} |
+ |
+void FadingControls::OnEvent(uint32 control_id, uint32 event_id, void* data) { |
+ owner()->OnEvent(control_id, event_id, data); |
+} |
+ |
+void FadingControls::Invalidate(uint32 control_id, const pp::Rect& rc) { |
+ owner()->Invalidate(control_id, rc); |
+} |
+ |
+uint32 FadingControls::ScheduleTimer(uint32 control_id, uint32 timeout_ms) { |
+ // TODO(gene): implement timer routine properly. |
+ NOTIMPLEMENTED(); |
+ //owner()->ScheduleTimer(control_id); |
+ return 0; |
+} |
+ |
+void FadingControls::SetEventCapture(uint32 control_id, bool set_capture) { |
+ if (control_id == current_capture_control_) { |
+ if (!set_capture) // Remove event capture. |
+ current_capture_control_ = kInvalidControlId; |
+ } else { |
+ EventCaptureReleased(); |
+ current_capture_control_ = control_id; |
+ } |
+} |
+ |
+void FadingControls::SetCursor(uint32 control_id, |
+ PP_CursorType_Dev cursor_type) { |
+ owner()->SetCursor(control_id, cursor_type); |
+} |
+ |
+pp::Instance* FadingControls::GetInstance() { |
+ return owner()->GetInstance(); |
+} |
+ |
+bool FadingControls::AddControl(Control* control) { |
+ DCHECK(control); |
+ if (control->owner() != this) |
+ return false; |
+ if (!rect().Contains(control->rect())) |
+ return false; |
+ |
+ control->AdjustTransparency(current_transparency_, false); |
+ controls_.push_back(control); |
+ return true; |
+} |
+ |
+void FadingControls::RemoveControl(uint32 control_id) { |
+ if (current_capture_control_ == control_id) { |
+ current_capture_control_ = kInvalidControlId; |
+ } |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ if ((*iter)->id() == control_id) { |
+ delete (*iter); |
+ controls_.erase(iter); |
+ break; |
+ } |
+ } |
+} |
+ |
+Control* FadingControls::GetControl(uint32 id) { |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ if ((*iter)->id() == id) |
+ return *iter; |
+ } |
+ return NULL; |
+} |
+ |
+pp::Rect FadingControls::GetControlsRect() { |
+ pp::Rect rc; |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ rc = rc.Union((*iter)->rect()); |
+ } |
+ return rc; |
+} |
+ |
+bool FadingControls::ExpandLeft(int offset) { |
+ pp::Rect rc = rect(); |
+ rc.set_width(rc.width() + offset); |
+ rc.set_x(rc.x() - offset); |
+ if (!rc.Contains(GetControlsRect())) |
+ return false; |
+ // No need to invalidate since we are expanding triggering area only. |
+ SetRect(rc, false); |
+ return true; |
+} |
+ |
+void FadingControls::Splash(uint32 time_ms) { |
+ splash_ = true; |
+ splash_timeout_ = time_ms; |
+ alpha_shift_ = kSplashFadingAlphaShift; |
+ FadeIn(); |
+} |
+ |
+bool FadingControls::NotifyControls(const pp::InputEvent& event) { |
+ // First pass event to a control that current capture is set to. |
+ Control* ctrl = GetControl(current_capture_control_); |
+ if (ctrl) { |
+ if (ctrl->HandleEvent(event)) |
+ return true; |
+ } |
+ |
+ std::list<Control*>::iterator iter; |
+ for (iter = controls_.begin(); iter != controls_.end(); ++iter) { |
+ // Now pass event to all control except control with capture, |
+ // since we already passed to it above. |
+ if ((*iter) != ctrl && (*iter)->HandleEvent(event)) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+void FadingControls::FadeIn() { |
+ bool already_visible = |
+ (state_ == NONE && current_transparency_ == kOpaqueAlpha); |
+ if (state_ != FADING_IN && !already_visible) { |
+ state_ = FADING_IN; |
+ fading_timer_id_ = owner()->ScheduleTimer(id(), fading_timeout_); |
+ } |
+ if (already_visible) |
+ OnFadingComplete(); |
+} |
+ |
+void FadingControls::FadeOut() { |
+ bool already_invisible = |
+ (state_ == NONE && current_transparency_ == kTransparentAlpha); |
+ if (state_ != FADING_OUT && !already_invisible) { |
+ state_ = FADING_OUT; |
+ fading_timer_id_ = owner()->ScheduleTimer(id(), fading_timeout_); |
+ } |
+ if (already_invisible) |
+ OnFadingComplete(); |
+} |
+ |
+void FadingControls::OnFadingComplete() { |
+ DCHECK(current_transparency_ == kOpaqueAlpha || |
+ current_transparency_ == kTransparentAlpha); |
+ // In the splash mode following states are possible: |
+ // Fade-in complete: splash_==true, splash_timeout_ != 0 |
+ // We need to schedule timer for splash_timeout_. |
+ // Splash timeout complete: splash_==true, splash_timeout_ == 0 |
+ // We need to fade out still using splash settings. |
+ // Fade-out complete: current_transparency_ == kTransparentAlpha |
+ // We need to cancel splash mode and go back to normal settings. |
+ if (splash_) { |
+ if (current_transparency_ == kOpaqueAlpha) { |
+ if (splash_timeout_) { |
+ fading_timer_id_ = owner()->ScheduleTimer(id(), splash_timeout_); |
+ splash_timeout_ = 0; |
+ } else { |
+ FadeOut(); |
+ } |
+ } else { |
+ CancelSplashMode(); |
+ } |
+ } |
+} |
+ |
+void FadingControls::CancelSplashMode() { |
+ splash_ = false; |
+ alpha_shift_ = kFadingAlphaShift; |
+} |
+ |
+} // namespace chrome_pdf |
Property changes on: pdf\fading_controls.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |