// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef CHROME_BROWSER_TABS_DRAGGED_TAB_VIEW_H_ #define CHROME_BROWSER_TABS_DRAGGED_TAB_VIEW_H_ #include "base/gfx/point.h" #include "base/gfx/size.h" #include "base/task.h" #include "chrome/common/slide_animation.h" #include "chrome/views/view.h" #include "skia/include/SkBitmap.h" namespace ChromeViews { class HWNDViewContainer; } namespace gfx { class Point; } class HWNDPhotobooth; class Tab; class TabContents; class TabRenderer; class DraggedTabView : public ChromeViews::View, public AnimationDelegate { public: DraggedTabView(TabContents* datasource, const gfx::Point& mouse_tab_offset, const gfx::Size& contents_size); virtual ~DraggedTabView(); // Moves the DraggedTabView to the appropriate location given the mouse // pointer at |screen_point|. void MoveTo(const gfx::Point& screen_point); // Notifies the DraggedTabView that it has become attached to a TabStrip. void Attach(int selected_width); // Notifies the DraggedTabView that it has been detached from a TabStrip. void Detach(HWNDPhotobooth* photobooth); // Notifies the DraggedTabView that it should update itself. void Update(); // Animates the DraggedTabView to the specified bounds, then calls back to // |callback|. void AnimateToBounds(const gfx::Rect& bounds, Callback0::Type* callback); // Returns the size of the DraggedTabView. Used when attaching to a TabStrip // to determine where to place the Tab in the attached TabStrip. gfx::Size attached_tab_size() const { return attached_tab_size_; } private: // Overridden from AnimationDelegate: virtual void AnimationProgressed(const Animation* animation); virtual void AnimationEnded(const Animation* animation); virtual void AnimationCanceled(const Animation* animation); // Overridden from ChromeViews::View: virtual void Paint(ChromeCanvas* canvas); virtual void Layout(); virtual void GetPreferredSize(CSize* out); // Paint the view, when it's attached to a TabStrip. void PaintAttachedTab(ChromeCanvas* canvas); // Paint the view, when it's not attached to any TabStrip. void PaintDetachedView(ChromeCanvas* canvas); // Resizes the container to fit the content for the current attachment mode. void ResizeContainer(); // Utility for scaling a size by the current scaling factor. int ScaleValue(int value); // The window that contains the DraggedTabView. ChromeViews::HWNDViewContainer* container_; // The renderer that paints the Tab shape. scoped_ptr renderer_; // True if the view is currently attached to a TabStrip. Controls rendering // and sizing modes. bool attached_; // The unscaled offset of the mouse from the top left of the dragged Tab. // This is used to maintain an appropriate offset for the mouse pointer when // dragging scaled and unscaled representations, and also to calculate the // position of detached windows. gfx::Point mouse_tab_offset_; // The desired width of the TabRenderer when the DraggedTabView is attached // to a TabStrip. gfx::Size attached_tab_size_; // A handle to the DIB containing the current screenshot of the TabContents // we are dragging. HWNDPhotobooth* photobooth_; // The dimensions of the TabContents being dragged. gfx::Size contents_size_; // The animation used to slide the attached view to its final location. SlideAnimation close_animation_; // A callback notified when the animation is complete. scoped_ptr animation_callback_; // The start and end bounds of the animation sequence. gfx::Rect animation_start_bounds_; gfx::Rect animation_end_bounds_; DISALLOW_EVIL_CONSTRUCTORS(DraggedTabView); }; #endif // CHROME_BROWSER_TABS_DRAGGED_TAB_VIEW_H_