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