1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// C++ bridge class to send a selector to a Cocoa object when the
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bookmark model changes.  Some Cocoa objects edit the bookmark model
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and temporarily save a copy of the state (e.g. bookmark button
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// editor).  As a fail-safe, these objects want an easy cancel if the
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// model changes out from under them.  For example, if you have the
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bookmark button editor sheet open, then edit the bookmark in the
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bookmark manager, we'd want to simply cancel the editor.
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class is conservative and may result in notifications which
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// aren't strictly necessary.  For example, node removal only needs to
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// cancel an edit if the removed node is a folder (editors often have
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a list of "new parents").  But, just to be sure, notification
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// happens on any removal.
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#import <Cocoa/Cocoa.h>
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_nsobject.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model_observer.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkModelObserverForCocoa : public BookmarkModelObserver {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When |node| in |model| changes, send |selector| to |object|.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Assumes |selector| is a selector that takes one arg, like an
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // IBOutlet.  The arg passed is nil.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Many notifications happen independently of node
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (e.g. BeingDeleted), so |node| can be nil.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |object| is NOT retained, since the expected use case is for
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ||object| to own the BookmarkModelObserverForCocoa and we don't
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // want a retain cycle.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModelObserverForCocoa(const BookmarkNode* node,
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                BookmarkModel* model,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                NSObject* object,
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                SEL selector);
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~BookmarkModelObserverForCocoa();
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void BookmarkModelBeingDeleted(BookmarkModel* model);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeMoved(BookmarkModel* model,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* old_parent,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int old_index,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* new_parent,
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                 int new_index);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeRemoved(BookmarkModel* model,
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const BookmarkNode* parent,
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   int old_index,
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const BookmarkNode* node);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeChanged(BookmarkModel* model,
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const BookmarkNode* node);
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void BookmarkImportBeginning(BookmarkModel* model);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Some notifications we don't care about, but by being pure virtual
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in the base class we must implement them.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Loaded(BookmarkModel* model) {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeAdded(BookmarkModel* model,
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* parent,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int index) {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void BookmarkNodeFaviconLoaded(BookmarkModel* model,
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         const BookmarkNode* node) {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const BookmarkNode* node) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkImportEnding(BookmarkModel* model) {
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* node_;  // Weak; owned by a BookmarkModel.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model_;  // Weak; it is owned by a Profile.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NSObject* object_; // Weak, like a delegate.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SEL selector_;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Notify();
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif  // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
91