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.
5 // C++ bridge class to send a selector to a Cocoa object when the
6 // bookmark model changes. Some Cocoa objects edit the bookmark model
7 // and temporarily save a copy of the state (e.g. bookmark button
8 // editor). As a fail-safe, these objects want an easy cancel if the
9 // model changes out from under them. For example, if you have the
10 // bookmark button editor sheet open, then edit the bookmark in the
11 // bookmark manager, we'd want to simply cancel the editor.
13 // This class is conservative and may result in notifications which
14 // aren't strictly necessary. For example, node removal only needs to
15 // cancel an edit if the removed node is a folder (editors often have
16 // a list of "new parents"). But, just to be sure, notification
17 // happens on any removal.
19 #ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
20 #define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
22 #import <Cocoa/Cocoa.h>
26 #include "base/basictypes.h"
27 #include "base/mac/scoped_block.h"
28 #include "components/bookmarks/browser/bookmark_model.h"
29 #include "components/bookmarks/browser/bookmark_model_observer.h"
31 class BookmarkModelObserverForCocoa
: public bookmarks::BookmarkModelObserver
{
33 // Callback called on a significant model change. |nodeWasDeleted| will
34 // be YES if an observed node was deleted in the change.
35 typedef void(^ChangeCallback
)(BOOL nodeWasDeleted
);
37 // When a |model| changes, or an observed node within it does, call a
39 BookmarkModelObserverForCocoa(bookmarks::BookmarkModel
* model
,
40 ChangeCallback callback
);
41 ~BookmarkModelObserverForCocoa() override
;
43 // Starts and stops observing a specified |node|; the node must be contained
45 void StartObservingNode(const bookmarks::BookmarkNode
* node
);
46 void StopObservingNode(const bookmarks::BookmarkNode
* node
);
48 // bookmarks::BookmarkModelObserver:
49 void BookmarkModelBeingDeleted(bookmarks::BookmarkModel
* model
) override
;
50 void BookmarkNodeMoved(bookmarks::BookmarkModel
* model
,
51 const bookmarks::BookmarkNode
* old_parent
,
53 const bookmarks::BookmarkNode
* new_parent
,
54 int new_index
) override
;
55 void BookmarkNodeRemoved(bookmarks::BookmarkModel
* model
,
56 const bookmarks::BookmarkNode
* parent
,
58 const bookmarks::BookmarkNode
* node
,
59 const std::set
<GURL
>& removed_urls
) override
;
60 void BookmarkAllUserNodesRemoved(bookmarks::BookmarkModel
* model
,
61 const std::set
<GURL
>& removed_urls
) override
;
62 void BookmarkNodeChanged(bookmarks::BookmarkModel
* model
,
63 const bookmarks::BookmarkNode
* node
) override
;
65 // Some notifications we don't care about, but by being pure virtual
66 // in the base class we must implement them.
68 void BookmarkModelLoaded(bookmarks::BookmarkModel
* model
,
69 bool ids_reassigned
) override
{}
70 void BookmarkNodeAdded(bookmarks::BookmarkModel
* model
,
71 const bookmarks::BookmarkNode
* parent
,
72 int index
) override
{}
73 void BookmarkNodeFaviconChanged(
74 bookmarks::BookmarkModel
* model
,
75 const bookmarks::BookmarkNode
* node
) override
{}
76 void BookmarkNodeChildrenReordered(
77 bookmarks::BookmarkModel
* model
,
78 const bookmarks::BookmarkNode
* node
) override
{}
80 void ExtensiveBookmarkChangesBeginning(
81 bookmarks::BookmarkModel
* model
) override
{}
83 void ExtensiveBookmarkChangesEnded(bookmarks::BookmarkModel
* model
) override
{
87 bookmarks::BookmarkModel
* model_
; // Weak; it is owned by a Profile.
88 std::set
<const bookmarks::BookmarkNode
*>
89 nodes_
; // Weak items owned by a BookmarkModel.
90 base::mac::ScopedBlock
<ChangeCallback
> callback_
;
92 // Send a notification to the client; |deleted| is YES if an observed node was
93 // deleted in the change.
94 void Notify(BOOL deleted
);
96 DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa
);
99 #endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H