1// Copyright (c) 2010 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/tabs/tab_strip_model.h"
8
9TabStripModelObserverBridge::TabStripModelObserverBridge(TabStripModel* model,
10                                                         id controller)
11    : controller_(controller), model_(model) {
12  DCHECK(model && controller);
13  // Register to be a listener on the model so we can get updates and tell
14  // |controller_| about them in the future.
15  model_->AddObserver(this);
16}
17
18TabStripModelObserverBridge::~TabStripModelObserverBridge() {
19  // Remove ourselves from receiving notifications.
20  model_->RemoveObserver(this);
21}
22
23void TabStripModelObserverBridge::TabInsertedAt(TabContentsWrapper* contents,
24                                                int index,
25                                                bool foreground) {
26  if ([controller_ respondsToSelector:
27          @selector(insertTabWithContents:atIndex:inForeground:)]) {
28    [controller_ insertTabWithContents:contents
29                               atIndex:index
30                          inForeground:foreground];
31  }
32}
33
34void TabStripModelObserverBridge::TabClosingAt(TabStripModel* tab_strip_model,
35                                               TabContentsWrapper* contents,
36                                               int index) {
37  if ([controller_ respondsToSelector:
38          @selector(tabClosingWithContents:atIndex:)]) {
39    [controller_ tabClosingWithContents:contents atIndex:index];
40  }
41}
42
43void TabStripModelObserverBridge::TabDetachedAt(TabContentsWrapper* contents,
44                                                int index) {
45  if ([controller_ respondsToSelector:
46          @selector(tabDetachedWithContents:atIndex:)]) {
47    [controller_ tabDetachedWithContents:contents atIndex:index];
48  }
49}
50
51void TabStripModelObserverBridge::TabSelectedAt(
52    TabContentsWrapper* old_contents,
53    TabContentsWrapper* new_contents,
54    int index,
55    bool user_gesture) {
56  if ([controller_ respondsToSelector:
57          @selector(selectTabWithContents:previousContents:atIndex:
58                    userGesture:)]) {
59    [controller_ selectTabWithContents:new_contents
60                      previousContents:old_contents
61                               atIndex:index
62                           userGesture:user_gesture];
63  }
64}
65
66void TabStripModelObserverBridge::TabMoved(TabContentsWrapper* contents,
67                                           int from_index,
68                                           int to_index) {
69  if ([controller_ respondsToSelector:
70       @selector(tabMovedWithContents:fromIndex:toIndex:)]) {
71    [controller_ tabMovedWithContents:contents
72                            fromIndex:from_index
73                              toIndex:to_index];
74  }
75}
76
77void TabStripModelObserverBridge::TabChangedAt(TabContentsWrapper* contents,
78                                               int index,
79                                               TabChangeType change_type) {
80  if ([controller_ respondsToSelector:
81          @selector(tabChangedWithContents:atIndex:changeType:)]) {
82    [controller_ tabChangedWithContents:contents
83                                atIndex:index
84                             changeType:change_type];
85  }
86}
87
88void TabStripModelObserverBridge::TabReplacedAt(
89    TabStripModel* tab_strip_model,
90    TabContentsWrapper* old_contents,
91    TabContentsWrapper* new_contents,
92    int index) {
93  if ([controller_ respondsToSelector:
94          @selector(tabReplacedWithContents:previousContents:atIndex:)]) {
95    [controller_ tabReplacedWithContents:new_contents
96                        previousContents:old_contents
97                                 atIndex:index];
98  } else {
99    TabChangedAt(new_contents, index, ALL);
100  }
101}
102
103void TabStripModelObserverBridge::TabMiniStateChanged(
104    TabContentsWrapper* contents, int index) {
105  if ([controller_ respondsToSelector:
106          @selector(tabMiniStateChangedWithContents:atIndex:)]) {
107    [controller_ tabMiniStateChangedWithContents:contents atIndex:index];
108  }
109}
110
111void TabStripModelObserverBridge::TabStripEmpty() {
112  if ([controller_ respondsToSelector:@selector(tabStripEmpty)])
113    [controller_ tabStripEmpty];
114}
115
116void TabStripModelObserverBridge::TabStripModelDeleted() {
117  if ([controller_ respondsToSelector:@selector(tabStripModelDeleted)])
118    [controller_ tabStripModelDeleted];
119}
120