172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file.
4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/constrained_html_ui.h"
6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/constrained_window_gtk.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h"
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/views/tab_contents/tab_contents_container.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_ui.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/widget/widget_gtk.h"
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// ConstrainedHtmlDelegateGtk works with ConstrainedWindowGtk to present
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// a TabContents in a ContraintedHtmlUI.
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ConstrainedHtmlDelegateGtk : public views::WidgetGtk,
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   public ConstrainedHtmlUIDelegate,
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   public ConstrainedWindowDelegate,
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   public HtmlDialogTabContentsDelegate {
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ConstrainedHtmlDelegateGtk(Profile* profile,
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             HtmlDialogUIDelegate* delegate);
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ~ConstrainedHtmlDelegateGtk();
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // ConstrainedHtmlUIDelegate interface.
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void OnDialogClose();
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool GetBackgroundColor(GdkColor* color) {
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    *color = gtk_util::kGdkWhite;
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return true;
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // ConstrainedWindowGtkDelegate implementation.
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual GtkWidget* GetWidgetRoot() {
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return GetNativeView();
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual GtkWidget* GetFocusWidget() {
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return html_tab_contents_.GetContentNativeView();
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void DeleteDelegate() {
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    html_delegate_->OnWindowClosed();
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    html_delegate_->OnDialogClosed("");
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    tab_container_->ChangeTabContents(NULL);
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool ShouldHaveBorderPadding() const {
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // HtmlDialogTabContentsDelegate interface.
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void MoveContents(TabContents* source, const gfx::Rect& pos) {}
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_window(ConstrainedWindow* window) {
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    window_ = window;
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TabContents html_tab_contents_;
624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TabContentsContainer* tab_container_;
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  HtmlDialogUIDelegate* html_delegate_;
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The constrained window that owns |this|.  Saved so we can close it later.
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ConstrainedWindow* window_;
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk(
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Profile* profile,
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    HtmlDialogUIDelegate* delegate)
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    : views::WidgetGtk(views::WidgetGtk::TYPE_CHILD),
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      HtmlDialogTabContentsDelegate(profile),
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      html_tab_contents_(profile, NULL, MSG_ROUTING_NONE, NULL, NULL),
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      tab_container_(NULL),
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      html_delegate_(delegate),
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      window_(NULL) {
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CHECK(delegate);
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  html_tab_contents_.set_delegate(this);
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Set |this| as a property so the ConstrainedHtmlUI can retrieve it.
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      html_tab_contents_.property_bag(), this);
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  html_tab_contents_.controller().LoadURL(delegate->GetDialogContentURL(),
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                          GURL(),
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                          PageTransition::START_PAGE);
884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Init(NULL, gfx::Rect());
904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  tab_container_ = new TabContentsContainer;
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  SetContentsView(tab_container_);
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  tab_container_->ChangeTabContents(&html_tab_contents_);
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Size dialog_size;
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  html_delegate_->GetDialogSize(&dialog_size);
974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gtk_widget_set_size_request(GetWidgetRoot(),
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                              dialog_size.width(),
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                              dialog_size.height());
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() {
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochHtmlDialogUIDelegate* ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() {
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return html_delegate_;
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid ConstrainedHtmlDelegateGtk::OnDialogClose() {
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  window_->CloseConstrainedWindow();
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// static
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Profile* profile,
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    HtmlDialogUIDelegate* delegate,
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TabContents* container) {
1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ConstrainedHtmlDelegateGtk* constrained_delegate =
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      new ConstrainedHtmlDelegateGtk(profile, delegate);
120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ConstrainedWindow* constrained_window =
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      container->CreateConstrainedDialog(constrained_delegate);
122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  constrained_delegate->set_window(constrained_window);
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return constrained_window;
124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
125