root/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. window_
  2. CloseContents
  3. set_window
  4. window
  5. SetBackgroundColor
  6. GetWebDialogDelegate
  7. GetWebDialogDelegate
  8. OnDialogCloseFromWebUI
  9. ReleaseWebContentsOnDialogClose
  10. GetNativeDialog
  11. GetWebContents
  12. SetWindow
  13. GetWindow
  14. OnDestroy
  15. CreateConstrainedWebDialog

// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h"

#include <gdk/gdk.h>
#include <gtk/gtk.h>

#include "chrome/browser/ui/gtk/constrained_window_gtk.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_view.h"
#include "ui/base/gtk/gtk_hig_constants.h"
#include "ui/base/gtk/gtk_signal.h"
#include "ui/gfx/size.h"
#include "ui/web_dialogs/web_dialog_delegate.h"
#include "ui/web_dialogs/web_dialog_ui.h"

using content::WebContents;
using ui::WebDialogDelegate;
using ui::WebDialogWebContentsDelegate;
using web_modal::WebContentsModalDialogManager;

namespace {

class ConstrainedWebDialogDelegateGtk
    : public ConstrainedWebDialogDelegateBase {
 public:
  ConstrainedWebDialogDelegateGtk(
      content::BrowserContext* browser_context,
      WebDialogDelegate* delegate,
      WebDialogWebContentsDelegate* tab_delegate)
      : ConstrainedWebDialogDelegateBase(
            browser_context, delegate, tab_delegate),
        window_(NULL) {}

  // WebDialogWebContentsDelegate interface.
  virtual void CloseContents(WebContents* source) OVERRIDE {
    gtk_widget_destroy(window_);
  }

  void set_window(GtkWidget* window) { window_ = window; }
  GtkWidget* window() const { return window_; }

 private:
  GtkWidget* window_;

  DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateGtk);
};

void SetBackgroundColor(GtkWidget* widget, const GdkColor &color) {
  gtk_widget_modify_base(widget, GTK_STATE_NORMAL, &color);
  gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &color);
  gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color);
}

}  // namespace

class ConstrainedWebDialogDelegateViewGtk
    : public ConstrainedWebDialogDelegate {
 public:
  ConstrainedWebDialogDelegateViewGtk(
      content::BrowserContext* browser_context,
      WebDialogDelegate* delegate,
      WebDialogWebContentsDelegate* tab_delegate);

  virtual ~ConstrainedWebDialogDelegateViewGtk() {}

  // ConstrainedWebDialogDelegate interface
  virtual const WebDialogDelegate*
      GetWebDialogDelegate() const OVERRIDE {
    return impl_->GetWebDialogDelegate();
  }
  virtual WebDialogDelegate* GetWebDialogDelegate() OVERRIDE {
    return impl_->GetWebDialogDelegate();
  }
  virtual void OnDialogCloseFromWebUI() OVERRIDE {
    return impl_->OnDialogCloseFromWebUI();
  }
  virtual void ReleaseWebContentsOnDialogClose() OVERRIDE {
    return impl_->ReleaseWebContentsOnDialogClose();
  }
  virtual web_modal::NativeWebContentsModalDialog GetNativeDialog() OVERRIDE {
    return impl_->window();
  }
  virtual WebContents* GetWebContents() OVERRIDE {
    return impl_->GetWebContents();
  }

  void SetWindow(GtkWidget* window) {
    impl_->set_window(window);
  }

  GtkWidget* GetWindow() {
    return impl_->window();
  }

 private:
  CHROMEGTK_CALLBACK_0(ConstrainedWebDialogDelegateViewGtk, void, OnDestroy);

  scoped_ptr<ConstrainedWebDialogDelegateGtk> impl_;

  DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewGtk);
};

ConstrainedWebDialogDelegateViewGtk::ConstrainedWebDialogDelegateViewGtk(
    content::BrowserContext* browser_context,
    WebDialogDelegate* delegate,
    WebDialogWebContentsDelegate* tab_delegate)
    : impl_(new ConstrainedWebDialogDelegateGtk(
          browser_context,
          delegate,
          tab_delegate)) {
  gfx::Size dialog_size;
  delegate->GetDialogSize(&dialog_size);
  GtkWidget* contents =
      GTK_WIDGET(GetWebContents()->GetView()->GetNativeView());
  gtk_widget_set_size_request(contents,
                              dialog_size.width(),
                              dialog_size.height());

  gtk_widget_show_all(contents);

  g_signal_connect(contents, "destroy", G_CALLBACK(OnDestroyThunk), this);
}

void ConstrainedWebDialogDelegateViewGtk::OnDestroy(GtkWidget* widget) {
  if (!impl_->closed_via_webui())
    GetWebDialogDelegate()->OnDialogClosed(std::string());
  delete this;
}

ConstrainedWebDialogDelegate* CreateConstrainedWebDialog(
      content::BrowserContext* browser_context,
      WebDialogDelegate* delegate,
      WebDialogWebContentsDelegate* tab_delegate,
      content::WebContents* web_contents) {
  ConstrainedWebDialogDelegateViewGtk* constrained_delegate =
      new ConstrainedWebDialogDelegateViewGtk(
          browser_context, delegate, tab_delegate);
  GtkWidget* window =
      CreateWebContentsModalDialogGtk(
          constrained_delegate->GetWebContents()->GetView()->GetNativeView(),
          constrained_delegate->GetWebContents()->GetView()->
              GetContentNativeView());
  SetBackgroundColor(window, ui::kGdkWhite);
  constrained_delegate->SetWindow(window);

  WebContentsModalDialogManager* web_contents_modal_dialog_manager =
      WebContentsModalDialogManager::FromWebContents(web_contents);
  web_contents_modal_dialog_manager->ShowDialog(window);

  return constrained_delegate;
}

/* [<][>][^][v][top][bottom][index][help] */