bookmark_model_observer_for_cocoa.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/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,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const BookmarkNode* node) OVERRIDE;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BookmarkAllNodesRemoved(BookmarkModel* model) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeChanged(BookmarkModel* model,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const BookmarkNode* node) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some notifications we don't care about, but by being pure virtual
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the base class we must implement them.
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BookmarkModelLoaded(BookmarkModel* model,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   bool ids_reassigned) OVERRIDE {}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeAdded(BookmarkModel* model,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const BookmarkNode* parent,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 int index) OVERRIDE {}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeFaviconChanged(BookmarkModel* model,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          const BookmarkNode* node) OVERRIDE {}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkNodeChildrenReordered(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModel* model,
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const BookmarkNode* node) OVERRIDE {}
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ExtensiveBookmarkChangesBeginning(
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BookmarkModel* model) OVERRIDE {}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE {}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model_;  // Weak; it is owned by a Profile.
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::set<const BookmarkNode*> nodes_;  // Weak items owned by a BookmarkModel.
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::mac::ScopedBlock<ChangeCallback> callback_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Send a notification to the client; |deleted| is YES if an observed node was
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // deleted in the change.
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Notify(BOOL deleted);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
95