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