Home | History | Annotate | Download | only in gtk
      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/ui/gtk/constrained_window_gtk.h"
      8 #include "chrome/browser/ui/gtk/gtk_util.h"
      9 #include "chrome/browser/ui/gtk/tab_contents_container_gtk.h"
     10 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
     11 #include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h"
     12 #include "chrome/browser/ui/webui/html_dialog_ui.h"
     13 #include "content/browser/renderer_host/render_view_host.h"
     14 #include "content/browser/tab_contents/tab_contents.h"
     15 #include "content/common/notification_source.h"
     16 #include "ui/gfx/rect.h"
     17 
     18 class ConstrainedHtmlDelegateGtk : public ConstrainedWindowGtkDelegate,
     19                                    public HtmlDialogTabContentsDelegate,
     20                                    public ConstrainedHtmlUIDelegate {
     21  public:
     22   ConstrainedHtmlDelegateGtk(Profile* profile,
     23                              HtmlDialogUIDelegate* delegate);
     24 
     25   virtual ~ConstrainedHtmlDelegateGtk();
     26 
     27   // ConstrainedWindowGtkDelegate ----------------------------------------------
     28   virtual GtkWidget* GetWidgetRoot() {
     29     return tab_contents_container_.widget();
     30   }
     31   virtual GtkWidget* GetFocusWidget() {
     32     return tab_.tab_contents()->GetContentNativeView();
     33   }
     34   virtual void DeleteDelegate() {
     35     html_delegate_->OnWindowClosed();
     36     html_delegate_->OnDialogClosed("");
     37     delete this;
     38   }
     39 
     40   // ConstrainedHtmlDelegate ---------------------------------------------
     41   virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
     42   virtual void OnDialogClose();
     43   virtual bool GetBackgroundColor(GdkColor* color) {
     44     *color = gtk_util::kGdkWhite;
     45     return true;
     46   }
     47 
     48   // HtmlDialogTabContentsDelegate ---------------------------------------------
     49   void MoveContents(TabContents* source, const gfx::Rect& pos) {}
     50   void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
     51 
     52   void set_window(ConstrainedWindow* window) {
     53     window_ = window;
     54   }
     55 
     56  private:
     57   TabContentsWrapper tab_;
     58   TabContentsContainerGtk tab_contents_container_;
     59   HtmlDialogUIDelegate* html_delegate_;
     60 
     61   // The constrained window that owns |this|. It's saved here because it needs
     62   // to be closed in response to the WebUI OnDialogClose callback.
     63   ConstrainedWindow* window_;
     64 };
     65 
     66 ConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk(
     67     Profile* profile,
     68     HtmlDialogUIDelegate* delegate)
     69     : HtmlDialogTabContentsDelegate(profile),
     70       tab_(new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL, NULL)),
     71       tab_contents_container_(NULL),
     72       html_delegate_(delegate),
     73       window_(NULL) {
     74   tab_.tab_contents()->set_delegate(this);
     75 
     76   // Set |this| as a property on the tab contents so that the ConstrainedHtmlUI
     77   // can get a reference to |this|.
     78   ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
     79       tab_.tab_contents()->property_bag(), this);
     80 
     81   tab_.tab_contents()->controller().LoadURL(
     82       delegate->GetDialogContentURL(), GURL(), PageTransition::START_PAGE);
     83   tab_contents_container_.SetTab(&tab_);
     84 
     85   gfx::Size dialog_size;
     86   delegate->GetDialogSize(&dialog_size);
     87   gtk_widget_set_size_request(GTK_WIDGET(tab_contents_container_.widget()),
     88                               dialog_size.width(),
     89                               dialog_size.height());
     90 
     91   gtk_widget_show_all(GetWidgetRoot());
     92 }
     93 
     94 ConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() {
     95 }
     96 
     97 HtmlDialogUIDelegate*
     98     ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() {
     99   return html_delegate_;
    100 }
    101 
    102 void ConstrainedHtmlDelegateGtk::OnDialogClose() {
    103   window_->CloseConstrainedWindow();
    104 }
    105 
    106 // static
    107 ConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
    108     Profile* profile,
    109     HtmlDialogUIDelegate* delegate,
    110     TabContents* overshadowed) {
    111   ConstrainedHtmlDelegateGtk* constrained_delegate =
    112       new ConstrainedHtmlDelegateGtk(profile, delegate);
    113   ConstrainedWindow* constrained_window =
    114       overshadowed->CreateConstrainedDialog(constrained_delegate);
    115   constrained_delegate->set_window(constrained_window);
    116   return constrained_window;
    117 }
    118