15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ bridge class to send a selector to a Cocoa object when the
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark model changes.  Some Cocoa objects edit the bookmark model
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and temporarily save a copy of the state (e.g. bookmark button
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// editor).  As a fail-safe, these objects want an easy cancel if the
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// model changes out from under them.  For example, if you have the
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark button editor sheet open, then edit the bookmark in the
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark manager, we'd want to simply cancel the editor.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is conservative and may result in notifications which
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// aren't strictly necessary.  For example, node removal only needs to
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel an edit if the removed node is a folder (editors often have
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a list of "new parents").  But, just to be sure, notification
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// happens on any removal.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set>
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/mac/scoped_block.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model_observer.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkModelObserverForCocoa : public BookmarkModelObserver {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback called on a significant model change. |nodeWasDeleted| will
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // be YES if an observed node was deleted in the change.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef void(^ChangeCallback)(BOOL nodeWasDeleted);
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When a |model| changes, or an observed node within it does, call a
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |callback|.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BookmarkModelObserverForCocoa(BookmarkModel* model,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                ChangeCallback callback);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BookmarkModelObserverForCocoa();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Starts and stops observing a specified |node|; the node must be contained
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // within the model.
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void StartObservingNode(const BookmarkNode* node);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void StopObservingNode(const BookmarkNode* node);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // BookmarkModelObserver:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeMoved(BookmarkModel* model,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const BookmarkNode* old_parent,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int old_index,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const BookmarkNode* new_parent,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int new_index) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeRemoved(BookmarkModel* model,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const BookmarkNode* parent,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int old_index,
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   const BookmarkNode* node,
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   const std::set<GURL>& removed_urls) OVERRIDE;
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void BookmarkAllUserNodesRemoved(
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      BookmarkModel* model,
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::set<GURL>& removed_urls) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeChanged(BookmarkModel* model,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const BookmarkNode* node) OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some notifications we don't care about, but by being pure virtual
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the base class we must implement them.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BookmarkModelLoaded(BookmarkModel* model,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   bool ids_reassigned) OVERRIDE {}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeAdded(BookmarkModel* model,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const BookmarkNode* parent,
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 int index) OVERRIDE {}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeFaviconChanged(BookmarkModel* model,
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          const BookmarkNode* node) OVERRIDE {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeChildrenReordered(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModel* model,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const BookmarkNode* node) OVERRIDE {}
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ExtensiveBookmarkChangesBeginning(
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BookmarkModel* model) OVERRIDE {}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE {}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model_;  // Weak; it is owned by a Profile.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::set<const BookmarkNode*> nodes_;  // Weak items owned by a BookmarkModel.
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::mac::ScopedBlock<ChangeCallback> callback_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Send a notification to the client; |deleted| is YES if an observed node was
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // deleted in the change.
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Notify(BOOL deleted);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
98