tab_strip_model_observer_bridge.mm revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h"
6
7#include "chrome/browser/ui/tabs/tab_strip_model.h"
8#include "chrome/browser/ui/tab_contents/tab_contents.h"
9
10using content::WebContents;
11
12namespace {
13
14// TODO(avi): Remove when TabStripModelObserver sends WebContents.
15content::WebContents* WebContentsOf(TabContents* tab_contents) {
16  return tab_contents ? tab_contents->web_contents() : NULL;
17}
18
19}  // namespace
20
21TabStripModelObserverBridge::TabStripModelObserverBridge(TabStripModel* model,
22                                                         id controller)
23    : controller_(controller), model_(model) {
24  DCHECK(model && controller);
25  // Register to be a listener on the model so we can get updates and tell
26  // |controller_| about them in the future.
27  model_->AddObserver(this);
28}
29
30TabStripModelObserverBridge::~TabStripModelObserverBridge() {
31  // Remove ourselves from receiving notifications.
32  model_->RemoveObserver(this);
33}
34
35void TabStripModelObserverBridge::TabInsertedAt(WebContents* contents,
36                                                int index,
37                                                bool foreground) {
38  if ([controller_ respondsToSelector:
39          @selector(insertTabWithContents:atIndex:inForeground:)]) {
40    [controller_ insertTabWithContents:contents
41                               atIndex:index
42                          inForeground:foreground];
43  }
44}
45
46void TabStripModelObserverBridge::TabClosingAt(TabStripModel* tab_strip_model,
47                                               WebContents* contents,
48                                               int index) {
49  if ([controller_ respondsToSelector:
50          @selector(tabClosingWithContents:atIndex:)]) {
51    [controller_ tabClosingWithContents:contents atIndex:index];
52  }
53}
54
55void TabStripModelObserverBridge::TabDetachedAt(WebContents* contents,
56                                                int index) {
57  if ([controller_ respondsToSelector:
58          @selector(tabDetachedWithContents:atIndex:)]) {
59    [controller_ tabDetachedWithContents:contents atIndex:index];
60  }
61}
62
63void TabStripModelObserverBridge::ActiveTabChanged(
64    TabContents* old_contents,
65    TabContents* new_contents,
66    int index,
67    bool user_gesture) {
68  if ([controller_ respondsToSelector:
69          @selector(activateTabWithContents:previousContents:atIndex:
70                    userGesture:)]) {
71    [controller_ activateTabWithContents:WebContentsOf(new_contents)
72                        previousContents:WebContentsOf(old_contents)
73                                 atIndex:index
74                             userGesture:user_gesture];
75  }
76}
77
78void TabStripModelObserverBridge::TabMoved(TabContents* contents,
79                                           int from_index,
80                                           int to_index) {
81  if ([controller_ respondsToSelector:
82       @selector(tabMovedWithContents:fromIndex:toIndex:)]) {
83    [controller_ tabMovedWithContents:WebContentsOf(contents)
84                            fromIndex:from_index
85                              toIndex:to_index];
86  }
87}
88
89void TabStripModelObserverBridge::TabChangedAt(TabContents* contents,
90                                               int index,
91                                               TabChangeType change_type) {
92  if ([controller_ respondsToSelector:
93          @selector(tabChangedWithContents:atIndex:changeType:)]) {
94    [controller_ tabChangedWithContents:WebContentsOf(contents)
95                                atIndex:index
96                             changeType:change_type];
97  }
98}
99
100void TabStripModelObserverBridge::TabReplacedAt(
101    TabStripModel* tab_strip_model,
102    TabContents* old_contents,
103    TabContents* new_contents,
104    int index) {
105  if ([controller_ respondsToSelector:
106          @selector(tabReplacedWithContents:previousContents:atIndex:)]) {
107    [controller_ tabReplacedWithContents:WebContentsOf(new_contents)
108                        previousContents:WebContentsOf(old_contents)
109                                 atIndex:index];
110  } else {
111    TabChangedAt(new_contents, index, ALL);
112  }
113}
114
115void TabStripModelObserverBridge::TabMiniStateChanged(
116    WebContents* contents,
117    int index) {
118  if ([controller_ respondsToSelector:
119          @selector(tabMiniStateChangedWithContents:atIndex:)]) {
120    [controller_ tabMiniStateChangedWithContents:contents
121                                         atIndex:index];
122  }
123}
124
125void TabStripModelObserverBridge::TabStripEmpty() {
126  if ([controller_ respondsToSelector:@selector(tabStripEmpty)])
127    [controller_ tabStripEmpty];
128}
129
130void TabStripModelObserverBridge::TabStripModelDeleted() {
131  if ([controller_ respondsToSelector:@selector(tabStripModelDeleted)])
132    [controller_ tabStripModelDeleted];
133}
134