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

// +build windows

package walk

import (
	"syscall"
	"unsafe"
)

import (
	"github.com/lxn/win"
)

var webViewIDocHostUIHandlerVtbl *win.IDocHostUIHandlerVtbl

func init() {
	AppendToWalkInit(func() {
		webViewIDocHostUIHandlerVtbl = &win.IDocHostUIHandlerVtbl{
			syscall.NewCallback(webView_IDocHostUIHandler_QueryInterface),
			syscall.NewCallback(webView_IDocHostUIHandler_AddRef),
			syscall.NewCallback(webView_IDocHostUIHandler_Release),
			syscall.NewCallback(webView_IDocHostUIHandler_ShowContextMenu),
			syscall.NewCallback(webView_IDocHostUIHandler_GetHostInfo),
			syscall.NewCallback(webView_IDocHostUIHandler_ShowUI),
			syscall.NewCallback(webView_IDocHostUIHandler_HideUI),
			syscall.NewCallback(webView_IDocHostUIHandler_UpdateUI),
			syscall.NewCallback(webView_IDocHostUIHandler_EnableModeless),
			syscall.NewCallback(webView_IDocHostUIHandler_OnDocWindowActivate),
			syscall.NewCallback(webView_IDocHostUIHandler_OnFrameWindowActivate),
			syscall.NewCallback(webView_IDocHostUIHandler_ResizeBorder),
			syscall.NewCallback(webView_IDocHostUIHandler_TranslateAccelerator),
			syscall.NewCallback(webView_IDocHostUIHandler_GetOptionKeyPath),
			syscall.NewCallback(webView_IDocHostUIHandler_GetDropTarget),
			syscall.NewCallback(webView_IDocHostUIHandler_GetExternal),
			syscall.NewCallback(webView_IDocHostUIHandler_TranslateUrl),
			syscall.NewCallback(webView_IDocHostUIHandler_FilterDataObject),
		}
	})
}

type webViewIDocHostUIHandler struct {
	win.IDocHostUIHandler
}

func webView_IDocHostUIHandler_QueryInterface(docHostUIHandler *webViewIDocHostUIHandler, riid win.REFIID, ppvObject *unsafe.Pointer) uintptr {
	// Just reuse the QueryInterface implementation we have for IOleClientSite.
	// We need to adjust object, which initially points at our
	// webViewIDocHostUIHandler, so it refers to the containing
	// webViewIOleClientSite for the call.
	var clientSite win.IOleClientSite
	var webViewInPlaceSite webViewIOleInPlaceSite

	ptr := uintptr(unsafe.Pointer(docHostUIHandler)) - uintptr(unsafe.Sizeof(clientSite)) -
		uintptr(unsafe.Sizeof(webViewInPlaceSite))

	return webView_IOleClientSite_QueryInterface((*webViewIOleClientSite)(unsafe.Pointer(ptr)), riid, ppvObject)
}

func webView_IDocHostUIHandler_AddRef(docHostUIHandler *webViewIDocHostUIHandler) uintptr {
	return 1
}

func webView_IDocHostUIHandler_Release(docHostUIHandler *webViewIDocHostUIHandler) uintptr {
	return 1
}

func webView_IDocHostUIHandler_ShowContextMenu(docHostUIHandler *webViewIDocHostUIHandler, dwID uint32, ppt *win.POINT, pcmdtReserved *win.IUnknown, pdispReserved uintptr) uintptr {
	var webViewInPlaceSite webViewIOleInPlaceSite
	var iOleClientSite win.IOleClientSite
	var wb WidgetBase
	ptr := uintptr(unsafe.Pointer(docHostUIHandler)) -
		uintptr(unsafe.Sizeof(webViewInPlaceSite)) -
		uintptr(unsafe.Sizeof(iOleClientSite)) -
		uintptr(unsafe.Sizeof(wb))
	webView := (*WebView)(unsafe.Pointer(ptr))

	// show context menu
	if webView.NativeContextMenuEnabled() {
		return win.S_FALSE
	}

	return win.S_OK
}

func webView_IDocHostUIHandler_GetHostInfo(docHostUIHandler *webViewIDocHostUIHandler, pInfo *win.DOCHOSTUIINFO) uintptr {
	pInfo.CbSize = uint32(unsafe.Sizeof(*pInfo))
	pInfo.DwFlags = win.DOCHOSTUIFLAG_NO3DBORDER
	pInfo.DwDoubleClick = win.DOCHOSTUIDBLCLK_DEFAULT

	return win.S_OK
}

func webView_IDocHostUIHandler_ShowUI(docHostUIHandler *webViewIDocHostUIHandler, dwID uint32, pActiveObject uintptr, pCommandTarget uintptr, pFrame *win.IOleInPlaceFrame, pDoc uintptr) uintptr {
	return win.S_OK
}

func webView_IDocHostUIHandler_HideUI(docHostUIHandler *webViewIDocHostUIHandler) uintptr {
	return win.S_OK
}

func webView_IDocHostUIHandler_UpdateUI(docHostUIHandler *webViewIDocHostUIHandler) uintptr {
	return win.S_OK
}

func webView_IDocHostUIHandler_EnableModeless(docHostUIHandler *webViewIDocHostUIHandler, fEnable win.BOOL) uintptr {
	return win.S_OK
}

func webView_IDocHostUIHandler_OnDocWindowActivate(docHostUIHandler *webViewIDocHostUIHandler, fActivate win.BOOL) uintptr {
	return win.S_OK
}

func webView_IDocHostUIHandler_OnFrameWindowActivate(docHostUIHandler *webViewIDocHostUIHandler, fActivate win.BOOL) uintptr {
	return win.S_OK
}

func webView_IDocHostUIHandler_ResizeBorder(docHostUIHandler *webViewIDocHostUIHandler, prcBorder *win.RECT, pUIWindow uintptr, fRameWindow win.BOOL) uintptr {
	return win.S_OK
}

func webView_IDocHostUIHandler_TranslateAccelerator(docHostUIHandler *webViewIDocHostUIHandler, lpMsg *win.MSG, pguidCmdGroup *syscall.GUID, nCmdID uint) uintptr {
	return win.S_FALSE
}

func webView_IDocHostUIHandler_GetOptionKeyPath(docHostUIHandler *webViewIDocHostUIHandler, pchKey *uint16, dw uint) uintptr {
	return win.S_FALSE
}

func webView_IDocHostUIHandler_GetDropTarget(docHostUIHandler *webViewIDocHostUIHandler, pDropTarget uintptr, ppDropTarget *uintptr) uintptr {
	return win.S_FALSE
}

func webView_IDocHostUIHandler_GetExternal(docHostUIHandler *webViewIDocHostUIHandler, ppDispatch *uintptr) uintptr {
	*ppDispatch = 0

	return win.S_FALSE
}

func webView_IDocHostUIHandler_TranslateUrl(docHostUIHandler *webViewIDocHostUIHandler, dwTranslate uint32, pchURLIn *uint16, ppchURLOut **uint16) uintptr {
	*ppchURLOut = nil

	return win.S_FALSE
}

func webView_IDocHostUIHandler_FilterDataObject(docHostUIHandler *webViewIDocHostUIHandler, pDO uintptr, ppDORet *uintptr) uintptr {
	*ppDORet = 0

	return win.S_FALSE
}