blob: f5246b63ac125e7dc6ac8e1df79797c165a56168 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// C++ bridge class to send a selector to a Cocoa object when the
// bookmark model changes. Some Cocoa objects edit the bookmark model
// and temporarily save a copy of the state (e.g. bookmark button
// editor). As a fail-safe, these objects want an easy cancel if the
// model changes out from under them. For example, if you have the
// bookmark button editor sheet open, then edit the bookmark in the
// bookmark manager, we'd want to simply cancel the editor.
//
// This class is conservative and may result in notifications which
// aren't strictly necessary. For example, node removal only needs to
// cancel an edit if the removed node is a folder (editors often have
// a list of "new parents"). But, just to be sure, notification
// happens on any removal.
#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
#import <Cocoa/Cocoa.h>
#include <set>
#include "base/basictypes.h"
#include "base/mac/scoped_block.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/bookmarks/bookmark_model_observer.h"
class BookmarkModelObserverForCocoa : public BookmarkModelObserver {
public:
// Callback called on a significant model change. |nodeWasDeleted| will
// be YES if an observed node was deleted in the change.
typedef void(^ChangeCallback)(BOOL nodeWasDeleted);
// When a |model| changes, or an observed node within it does, call a
// |callback|.
BookmarkModelObserverForCocoa(BookmarkModel* model,
ChangeCallback callback);
virtual ~BookmarkModelObserverForCocoa();
// Starts and stops observing a specified |node|; the node must be contained
// within the model.
void StartObservingNode(const BookmarkNode* node);
void StopObservingNode(const BookmarkNode* node);
// BookmarkModelObserver:
virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
virtual void BookmarkNodeMoved(BookmarkModel* model,
const BookmarkNode* old_parent,
int old_index,
const BookmarkNode* new_parent,
int new_index) OVERRIDE;
virtual void BookmarkNodeRemoved(BookmarkModel* model,
const BookmarkNode* parent,
int old_index,
const BookmarkNode* node) OVERRIDE;
virtual void BookmarkAllNodesRemoved(BookmarkModel* model) OVERRIDE;
virtual void BookmarkNodeChanged(BookmarkModel* model,
const BookmarkNode* node) OVERRIDE;
// Some notifications we don't care about, but by being pure virtual
// in the base class we must implement them.
virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE { }
virtual void BookmarkNodeAdded(BookmarkModel* model,
const BookmarkNode* parent,
int index) OVERRIDE { }
virtual void BookmarkNodeFaviconChanged(BookmarkModel* model,
const BookmarkNode* node) OVERRIDE { }
virtual void BookmarkNodeChildrenReordered(
BookmarkModel* model,
const BookmarkNode* node) OVERRIDE { }
virtual void ExtensiveBookmarkChangesBeginning(
BookmarkModel* model) OVERRIDE { }
virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE { }
private:
BookmarkModel* model_; // Weak; it is owned by a Profile.
std::set<const BookmarkNode*> nodes_; // Weak items owned by a BookmarkModel.
base::mac::ScopedBlock<ChangeCallback> callback_;
// Send a notification to the client; |deleted| is YES if an observed node was
// deleted in the change.
void Notify(BOOL deleted);
DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa);
};
#endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H