15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/tabs/drag_data.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/tabs/tab_gtk.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DraggedTabData::DraggedTabData()
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : tab_(NULL),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contents_(NULL),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_delegate_(NULL),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_model_index_(-1),
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pinned_(false),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mini_(false) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DraggedTabData::DraggedTabData(TabGtk* tab,
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               WebContents* contents,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               content::WebContentsDelegate* original_delegate,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int source_model_index,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool pinned,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool mini)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : tab_(tab),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contents_(contents),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_delegate_(original_delegate),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_model_index_(source_model_index),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pinned_(pinned),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mini_(mini) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DraggedTabData::~DraggedTabData() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DraggedTabData::ResetDelegate() {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_->SetDelegate(original_delegate_);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DragData::DragData(std::vector<DraggedTabData> drag_data, int source_tab_index)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : drag_data_(drag_data),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_tab_index_(source_tab_index),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      non_mini_tab_count_(0),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mini_tab_count_(0) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumberOfMiniNonMiniTabs(0, drag_data_.size(),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &mini_tab_count_, &non_mini_tab_count_);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DragData::~DragData() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<TabGtk*> DragData::GetDraggedTabs() const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TabGtk*> tabs;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < drag_data_.size(); ++i) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (drag_data_[i].tab_)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tabs.push_back(drag_data_[i].tab_);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return tabs;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<WebContents*> DragData::GetDraggedTabsContents() const {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<WebContents*> web_contentses;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < drag_data_.size(); ++i) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (drag_data_[i].contents_)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contentses.push_back(drag_data_[i].contents_);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return web_contentses;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DragData::GetNumberOfMiniNonMiniTabs(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int from, int to, int* mini, int* non_mini) const {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(to <= static_cast<int>(drag_data_.size()));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *mini = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *non_mini = 0;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = from; i < to; ++i) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (drag_data_[i].mini_)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*mini)++;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*non_mini)++;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DragData::GetAddTypesForDraggedTabAt(size_t index) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int add_types = TabStripModel::ADD_NONE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (get(index)->pinned_)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add_types |= TabStripModel::ADD_PINNED;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (static_cast<int>(index) == source_tab_index_)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add_types |= TabStripModel::ADD_ACTIVE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return add_types;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* DragData::GetSourceWebContents() {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetSourceTabData()->contents_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DraggedTabData* DragData::GetSourceTabData() {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return get(source_tab_index_);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
104