Home | History | Annotate | Download | only in bookmarks
      1 // Copyright (c) 2011 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.
      4 
      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.
     12 //
     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.
     18 
     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
     21 #pragma once
     22 
     23 #import <Cocoa/Cocoa.h>
     24 
     25 #include "base/basictypes.h"
     26 #include "base/memory/scoped_nsobject.h"
     27 #include "chrome/browser/bookmarks/bookmark_model.h"
     28 #include "chrome/browser/bookmarks/bookmark_model_observer.h"
     29 
     30 class BookmarkModelObserverForCocoa : public BookmarkModelObserver {
     31  public:
     32   // When |node| in |model| changes, send |selector| to |object|.
     33   // Assumes |selector| is a selector that takes one arg, like an
     34   // IBOutlet.  The arg passed is nil.
     35   // Many notifications happen independently of node
     36   // (e.g. BeingDeleted), so |node| can be nil.
     37   //
     38   // |object| is NOT retained, since the expected use case is for
     39   // ||object| to own the BookmarkModelObserverForCocoa and we don't
     40   // want a retain cycle.
     41   BookmarkModelObserverForCocoa(const BookmarkNode* node,
     42                                 BookmarkModel* model,
     43                                 NSObject* object,
     44                                 SEL selector);
     45   virtual ~BookmarkModelObserverForCocoa();
     46 
     47   virtual void BookmarkModelBeingDeleted(BookmarkModel* model);
     48   virtual void BookmarkNodeMoved(BookmarkModel* model,
     49                                  const BookmarkNode* old_parent,
     50                                  int old_index,
     51                                  const BookmarkNode* new_parent,
     52                                  int new_index);
     53   virtual void BookmarkNodeRemoved(BookmarkModel* model,
     54                                    const BookmarkNode* parent,
     55                                    int old_index,
     56                                    const BookmarkNode* node);
     57   virtual void BookmarkNodeChanged(BookmarkModel* model,
     58                                    const BookmarkNode* node);
     59   virtual void BookmarkImportBeginning(BookmarkModel* model);
     60 
     61   // Some notifications we don't care about, but by being pure virtual
     62   // in the base class we must implement them.
     63   virtual void Loaded(BookmarkModel* model) {
     64   }
     65   virtual void BookmarkNodeAdded(BookmarkModel* model,
     66                                  const BookmarkNode* parent,
     67                                  int index) {
     68   }
     69   virtual void BookmarkNodeFaviconLoaded(BookmarkModel* model,
     70                                          const BookmarkNode* node) {
     71   }
     72   virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
     73                                              const BookmarkNode* node) {
     74   }
     75 
     76   virtual void BookmarkImportEnding(BookmarkModel* model) {
     77   }
     78 
     79  private:
     80   const BookmarkNode* node_;  // Weak; owned by a BookmarkModel.
     81   BookmarkModel* model_;  // Weak; it is owned by a Profile.
     82   NSObject* object_; // Weak, like a delegate.
     83   SEL selector_;
     84 
     85   void Notify();
     86 
     87   DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa);
     88 };
     89 
     90 #endif  // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H
     91