15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_MODEL_OBSERVER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_MODEL_OBSERVER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <set>
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkModel;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkNode;
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GURL;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Observer for the BookmarkModel.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkModelObserver {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when the model has finished loading. |ids_reassigned| mirrors
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that of BookmarkLoadDetails::ids_reassigned. See it for details.
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BookmarkModelLoaded(BookmarkModel* model,
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   bool ids_reassigned) = 0;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked from the destructor of the BookmarkModel.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkModelBeingDeleted(BookmarkModel* model) {}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when a node has moved.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeMoved(BookmarkModel* model,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const BookmarkNode* old_parent,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int old_index,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const BookmarkNode* new_parent,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int new_index) = 0;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Invoked prior to adding a bookmark node, and in particular, prior to adding
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // it to the parent. This function can be used to alter the contents of the
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // node before BookmarkNodeAdded listeners know about it.
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnWillAddBookmarkNode(BookmarkModel* model,
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     BookmarkNode* node) {}
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when a node has been added.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeAdded(BookmarkModel* model,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const BookmarkNode* parent,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int index) = 0;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Invoked before a node is removed.
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |parent| the parent of the node that will be removed.
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |old_index| the index of the node about to be removed in |parent|.
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |node| is the node to be removed.
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnWillRemoveBookmarks(BookmarkModel* model,
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     const BookmarkNode* parent,
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     int old_index,
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     const BookmarkNode* node) {}
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when a node has been removed, the item may still be starred though.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |parent| the parent of the node that was removed.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |old_index| the index of the removed node in |parent| before it was
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // removed.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |node| is the node that was removed.
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // |removed_urls| is populated with the urls which no longer have any
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // bookmarks associated with them.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeRemoved(BookmarkModel* model,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const BookmarkNode* parent,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int old_index,
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   const BookmarkNode* node,
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   const std::set<GURL>& removed_urls) = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Invoked before the title or url of a node is changed.
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnWillChangeBookmarkNode(BookmarkModel* model,
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                        const BookmarkNode* node) {}
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when the title or url of a node changes.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeChanged(BookmarkModel* model,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const BookmarkNode* node) = 0;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Invoked before the metainfo of a node is changed.
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void OnWillChangeBookmarkMetaInfo(BookmarkModel* model,
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                            const BookmarkNode* node) {}
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Invoked when the metainfo on a node changes.
788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void BookmarkMetaInfoChanged(BookmarkModel* model,
798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                       const BookmarkNode* node) {}
808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when a favicon has been loaded or changed.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeFaviconChanged(BookmarkModel* model,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const BookmarkNode* node) = 0;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Invoked before the direct children of |node| have been reordered in some
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // way, such as sorted.
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnWillReorderBookmarkNode(BookmarkModel* model,
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                         const BookmarkNode* node) {}
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when the children (just direct children, not descendants) of
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |node| have been reordered in some way, such as sorted.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const BookmarkNode* node) = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked before an extensive set of model changes is about to begin.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This tells UI intensive observers to wait until the updates finish to
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // update themselves.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These methods should only be used for imports and sync.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observers should still respond to BookmarkNodeRemoved immediately,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to avoid holding onto stale node pointers.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) {}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked after an extensive set of model changes has ended.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This tells observers to update themselves if they were waiting for the
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // update to finish.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) {}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Invoked before all non-permanent bookmark nodes that are editable by
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // the user are removed.
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnWillRemoveAllUserBookmarks(BookmarkModel* model) {}
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Invoked when all non-permanent bookmark nodes that are editable by the
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // user have been removed.
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // |removed_urls| is populated with the urls which no longer have any
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // bookmarks associated with them.
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void BookmarkAllUserNodesRemoved(
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BookmarkModel* model,
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::set<GURL>& removed_urls) = 0;
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Invoked before a set of model changes that is initiated by a single user
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // action. For example, this is called a single time when pasting from the
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // clipboard before each pasted bookmark is added to the bookmark model.
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void GroupedBookmarkChangesBeginning(BookmarkModel* model) {}
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Invoked after a set of model changes triggered by a single user action has
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ended.
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void GroupedBookmarkChangesEnded(BookmarkModel* model) {}
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BookmarkModelObserver() {}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_MODEL_OBSERVER_H_
134