// Copyright (c) 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.

#ifndef CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_VIEW_WIN_DELEGATE_H_
#define CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_VIEW_WIN_DELEGATE_H_

#if defined(TOOLKIT_GTK)
#include <gtk/gtk.h>
#elif defined(OS_MACOSX)
#import <Cocoa/Cocoa.h>
#endif

#include "content/common/content_export.h"
#include "ui/gfx/native_widget_types.h"

#if defined(OS_MACOSX)
@protocol RenderWidgetHostViewMacDelegate;
#endif

namespace gfx {
class Size;
}

namespace ui {
class FocusStoreGtk;
}

namespace content {

class RenderWidgetHost;
class WebDragDestDelegate;
struct ContextMenuParams;

// This interface allows a client to extend the functionality of the
// WebContentsView implementation.
class CONTENT_EXPORT WebContentsViewDelegate {
 public:
  virtual ~WebContentsViewDelegate() {}

  // Returns a delegate to process drags not handled by content.
  virtual WebDragDestDelegate* GetDragDestDelegate() = 0;

  // Shows a context menu.
  virtual void ShowContextMenu(const content::ContextMenuParams& params) = 0;

#if defined(OS_WIN) || defined(USE_AURA)
  // These methods allow the embedder to intercept WebContentsViewWin's
  // implementation of these WebContentsView methods. See the WebContentsView
  // interface documentation for more information about these methods.
  virtual void StoreFocus() = 0;
  virtual void RestoreFocus() = 0;
  virtual bool Focus() = 0;
  virtual void TakeFocus(bool reverse) = 0;
  virtual void SizeChanged(const gfx::Size& size) = 0;
#elif defined(TOOLKIT_GTK)
  // Initializes the WebContentsViewDelegate.
  virtual void Initialize(GtkWidget* expanded_container,
                          ui::FocusStoreGtk* focus_store) = 0;

  // Returns the top widget that contains |view| passed in from WrapView. This
  // is exposed through WebContentsViewGtk::GetNativeView() when a wrapper is
  // supplied to a WebContentsViewGtk.
  virtual gfx::NativeView GetNativeView() const = 0;

  // Handles a focus event from the renderer process.
  virtual void Focus() = 0;

  // Gives the delegate a first chance at focus events from our render widget
  // host, before the main view invokes its default behaviour. Returns TRUE if
  // |return_value| has been set and that value should be returned to GTK+.
  virtual gboolean OnNativeViewFocusEvent(GtkWidget* widget,
                                          GtkDirectionType type,
                                          gboolean* return_value) = 0;
#elif defined(OS_MACOSX)
  // Returns a newly-created delegate for the RenderWidgetHostViewMac, to handle
  // events on the responder chain.
  virtual NSObject<RenderWidgetHostViewMacDelegate>*
      CreateRenderWidgetHostViewDelegate(
          RenderWidgetHost* render_widget_host) = 0;
#endif
};

}  // namespace content

#endif  // CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_VIEW_WIN_DELEGATE_H_
