Home | History | Annotate | Download | only in views
      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 #include "chrome/browser/ui/webui/constrained_html_ui.h"
      6 
      7 #include "chrome/browser/profiles/profile.h"
      8 #include "chrome/browser/ui/views/tab_contents/tab_contents_container.h"
      9 #include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h"
     10 #include "chrome/browser/ui/webui/html_dialog_ui.h"
     11 #include "content/browser/tab_contents/tab_contents.h"
     12 #include "ui/gfx/rect.h"
     13 #include "views/view.h"
     14 #include "views/widget/widget_win.h"
     15 #include "views/window/window_delegate.h"
     16 
     17 class ConstrainedHtmlDelegateWin : public TabContentsContainer,
     18                                    public ConstrainedHtmlUIDelegate,
     19                                    public ConstrainedWindowDelegate,
     20                                    public HtmlDialogTabContentsDelegate {
     21  public:
     22   ConstrainedHtmlDelegateWin(Profile* profile,
     23                              HtmlDialogUIDelegate* delegate);
     24   ~ConstrainedHtmlDelegateWin();
     25 
     26   // ConstrainedHtmlUIDelegate interface.
     27   virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
     28   virtual void OnDialogClose();
     29 
     30   // ConstrainedWindowDelegate (aka views::WindowDelegate) interface.
     31   virtual bool CanResize() const { return true; }
     32   virtual views::View* GetContentsView() {
     33     return this;
     34   }
     35   virtual void WindowClosing() {
     36     html_delegate_->OnWindowClosed();
     37     html_delegate_->OnDialogClosed("");
     38   }
     39 
     40   // HtmlDialogTabContentsDelegate interface.
     41   void MoveContents(TabContents* source, const gfx::Rect& pos) {}
     42   void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
     43 
     44   // Overridden from TabContentsContainer.
     45   virtual gfx::Size GetPreferredSize() {
     46     gfx::Size size;
     47     html_delegate_->GetDialogSize(&size);
     48     return size;
     49   }
     50 
     51   virtual void ViewHierarchyChanged(bool is_add,
     52                                     views::View* parent,
     53                                     views::View* child) {
     54     TabContentsContainer::ViewHierarchyChanged(is_add, parent, child);
     55     if (is_add && child == this) {
     56       ChangeTabContents(&html_tab_contents_);
     57     }
     58   }
     59 
     60   void set_window(ConstrainedWindow* window) {
     61     window_ = window;
     62   }
     63 
     64  private:
     65   TabContents html_tab_contents_;
     66 
     67   HtmlDialogUIDelegate* html_delegate_;
     68 
     69   // The constrained window that owns |this|.  Saved so we can close it later.
     70   ConstrainedWindow* window_;
     71 };
     72 
     73 ConstrainedHtmlDelegateWin::ConstrainedHtmlDelegateWin(
     74     Profile* profile,
     75     HtmlDialogUIDelegate* delegate)
     76     : HtmlDialogTabContentsDelegate(profile),
     77       html_tab_contents_(profile, NULL, MSG_ROUTING_NONE, NULL, NULL),
     78       html_delegate_(delegate),
     79       window_(NULL) {
     80   CHECK(delegate);
     81   html_tab_contents_.set_delegate(this);
     82 
     83   // Set |this| as a property so the ConstrainedHtmlUI can retrieve it.
     84   ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
     85       html_tab_contents_.property_bag(), this);
     86   html_tab_contents_.controller().LoadURL(delegate->GetDialogContentURL(),
     87                                           GURL(),
     88                                           PageTransition::START_PAGE);
     89 }
     90 
     91 ConstrainedHtmlDelegateWin::~ConstrainedHtmlDelegateWin() {
     92 }
     93 
     94 HtmlDialogUIDelegate* ConstrainedHtmlDelegateWin::GetHtmlDialogUIDelegate() {
     95   return html_delegate_;
     96 }
     97 
     98 void ConstrainedHtmlDelegateWin::OnDialogClose() {
     99   window_->CloseConstrainedWindow();
    100 }
    101 
    102 // static
    103 ConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
    104     Profile* profile,
    105     HtmlDialogUIDelegate* delegate,
    106     TabContents* container) {
    107   ConstrainedHtmlDelegateWin* constrained_delegate =
    108       new ConstrainedHtmlDelegateWin(profile, delegate);
    109   ConstrainedWindow* constrained_window =
    110       container->CreateConstrainedDialog(constrained_delegate);
    111   constrained_delegate->set_window(constrained_window);
    112   return constrained_window;
    113 }
    114