Home | History | Annotate | Download | only in cocoa
      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 #ifndef CHROME_BROWSER_UI_COCOA_CONSTRAINED_WINDOW_MAC_H_
      6 #define CHROME_BROWSER_UI_COCOA_CONSTRAINED_WINDOW_MAC_H_
      7 #pragma once
      8 
      9 #import <Cocoa/Cocoa.h>
     10 
     11 #include "content/browser/tab_contents/constrained_window.h"
     12 
     13 #include "base/basictypes.h"
     14 #include "base/logging.h"
     15 #include "base/memory/scoped_nsobject.h"
     16 
     17 @class BrowserWindowController;
     18 @class GTMWindowSheetController;
     19 @class NSView;
     20 @class NSWindow;
     21 class TabContents;
     22 
     23 // Base class for constrained dialog delegates. Never inherit from this
     24 // directly.
     25 class ConstrainedWindowMacDelegate {
     26  public:
     27   ConstrainedWindowMacDelegate() : is_sheet_open_(false) {}
     28   virtual ~ConstrainedWindowMacDelegate() {}
     29 
     30   // Tells the delegate to either delete itself or set up a task to delete
     31   // itself later. Note that you MUST close the sheet belonging to your delegate
     32   // in this method.
     33   virtual void DeleteDelegate() = 0;
     34 
     35   // Called by the tab controller, you do not need to do anything yourself
     36   // with this method.
     37   virtual void RunSheet(GTMWindowSheetController* sheetController,
     38                         NSView* view) = 0;
     39  protected:
     40   // Returns true if this delegate's sheet is currently showing.
     41   bool is_sheet_open() { return is_sheet_open_; }
     42 
     43  private:
     44   bool is_sheet_open_;
     45   void set_sheet_open(bool is_open) { is_sheet_open_ = is_open; }
     46   friend class ConstrainedWindowMac;
     47 };
     48 
     49 // Subclass this for a dialog delegate that displays a system sheet such as
     50 // an NSAlert, an open or save file panel, etc.
     51 class ConstrainedWindowMacDelegateSystemSheet
     52     : public ConstrainedWindowMacDelegate {
     53  public:
     54   ConstrainedWindowMacDelegateSystemSheet(id delegate, SEL didEndSelector);
     55   virtual ~ConstrainedWindowMacDelegateSystemSheet();
     56 
     57  protected:
     58   void set_sheet(id sheet);
     59   id sheet() { return systemSheet_; }
     60 
     61   // Returns an NSArray to be passed as parameters to GTMWindowSheetController.
     62   // Array's contents should be the arguments passed to the system sheet's
     63   // beginSheetForWindow:... method. The window argument must be [NSNull null].
     64   //
     65   // The default implementation returns
     66   //     [null window, delegate, didEndSelector, null contextInfo]
     67   // Subclasses may override this if they show a system sheet which takes
     68   // different parameters.
     69   virtual NSArray* GetSheetParameters(id delegate, SEL didEndSelector);
     70 
     71  private:
     72   virtual void RunSheet(GTMWindowSheetController* sheetController,
     73                         NSView* view);
     74   scoped_nsobject<id> systemSheet_;
     75   scoped_nsobject<id> delegate_;
     76   SEL didEndSelector_;
     77 };
     78 
     79 // Subclass this for a dialog delegate that displays a custom sheet, e.g. loaded
     80 // from a nib file.
     81 class ConstrainedWindowMacDelegateCustomSheet
     82     : public ConstrainedWindowMacDelegate {
     83  public:
     84   ConstrainedWindowMacDelegateCustomSheet();
     85   ConstrainedWindowMacDelegateCustomSheet(id delegate, SEL didEndSelector);
     86   ~ConstrainedWindowMacDelegateCustomSheet();
     87 
     88  protected:
     89   // For when you need to delay initalization after the constructor call.
     90   void init(NSWindow* sheet, id delegate, SEL didEndSelector);
     91   void set_sheet(NSWindow* sheet);
     92   NSWindow* sheet() { return customSheet_; }
     93 
     94  private:
     95   virtual void RunSheet(GTMWindowSheetController* sheetController,
     96                         NSView* view);
     97   scoped_nsobject<NSWindow> customSheet_;
     98   scoped_nsobject<id> delegate_;
     99   SEL didEndSelector_;
    100 };
    101 
    102 // Constrained window implementation for the Mac port. A constrained window
    103 // is a per-tab sheet on OS X.
    104 //
    105 // Constrained windows work slightly differently on OS X than on the other
    106 // platforms:
    107 // 1. A constrained window is bound to both a tab and window on OS X.
    108 // 2. The delegate is responsible for closing the sheet again when it is
    109 //    deleted.
    110 class ConstrainedWindowMac : public ConstrainedWindow {
    111  public:
    112   virtual ~ConstrainedWindowMac();
    113 
    114   // Overridden from ConstrainedWindow:
    115   virtual void ShowConstrainedWindow();
    116   virtual void CloseConstrainedWindow();
    117 
    118   // Returns the TabContents that constrains this Constrained Window.
    119   TabContents* owner() const { return owner_; }
    120 
    121   // Returns the window's delegate.
    122   ConstrainedWindowMacDelegate* delegate() { return delegate_; }
    123 
    124   // Makes the constrained window visible, if it is not yet visible.
    125   void Realize(BrowserWindowController* controller);
    126 
    127  private:
    128   friend class ConstrainedWindow;
    129 
    130   ConstrainedWindowMac(TabContents* owner,
    131                        ConstrainedWindowMacDelegate* delegate);
    132 
    133   // The TabContents that owns and constrains this ConstrainedWindow.
    134   TabContents* owner_;
    135 
    136   // Delegate that provides the contents of this constrained window.
    137   ConstrainedWindowMacDelegate* delegate_;
    138 
    139   // Controller of the window that contains this sheet.
    140   BrowserWindowController* controller_;
    141 
    142   // Stores if |ShowConstrainedWindow()| was called.
    143   bool should_be_visible_;
    144 
    145   DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowMac);
    146 };
    147 
    148 #endif  // CHROME_BROWSER_UI_COCOA_CONSTRAINED_WINDOW_MAC_H_
    149 
    150