energy/cef/cef-events-callback.go

320 lines
11 KiB
Go

//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under GNU General Public License v3.0
//
//----------------------------------------
package cef
import (
. "github.com/energye/energy/common"
. "github.com/energye/energy/consts"
"github.com/energye/energy/ipc"
"github.com/energye/energy/logger"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/api"
"github.com/energye/golcl/lcl/rtl"
"github.com/energye/golcl/lcl/types/messages"
)
// 事件处理函数返回true将不继续执行
func chromiumOnAfterCreate(browser *ICefBrowser) bool {
if viewSourceAfterCreate(browser) {
return true
}
if IsWindows() {
rtl.SendMessage(browser.HostWindowHandle(), messages.WM_SETICON, 1, lcl.Application.Icon().Handle())
}
return false
}
func chromiumOnBeforeBrowser(browser *ICefBrowser, frame *ICefFrame) {
BrowserWindow.putBrowserFrame(browser, frame)
if BrowserWindow.popupWindow != nil {
if browser.Identifier() < BrowserWindow.GetNextWindowNum() {
return
}
}
BrowserWindow.setOrIncNextWindowNum(browser.Identifier() + 1)
if IsMessageLoop {
} else {
QueueAsyncCall(func(id int) {
BrowserWindow.createNextLCLPopupWindow()
})
}
}
func chromiumOnBeforeClose(browser *ICefBrowser) {
if ipc.IPC.Render() != nil && !SingleProcess && processName != PT_DEVTOOLS {
ipc.IPC.Render().Close()
}
}
func chromiumOnFrameDetached(browser *ICefBrowser, frame *ICefFrame) {
BrowserWindow.RemoveFrame(browser.Identifier(), frame.Id)
}
func cefAppContextCreated(browser *ICefBrowser, frame *ICefFrame) {
BrowserWindow.putBrowserFrame(browser, frame)
BrowserWindow.removeNoValidFrames()
if VariableBind.ValueBindCount() == 0 && len(objectSti.StructsObject) == 0 {
__idReset()
clearValueBind()
bindGoToJS(browser, frame)
}
ipc.IPC.CreateRenderIPC(browser.Identifier(), frame.Id)
}
var (
refreshId, forcedRefreshId MenuId
devToolsId, viewSourceId, closeBrowserId MenuId
backId, forwardId, printId MenuId
undoId, redoId, cutId, copyId, pasteId, delId, selectAllId MenuId
imageUrlId, copyImageId, imageSaveId, aUrlId MenuId
)
func chromiumOnBeforeContextMenu(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, model *ICefMenuModel) {
if !api.GoBool(BrowserWindow.Config.chromiumConfig.enableMenu) {
model.Clear()
return
}
if winInfo := BrowserWindow.GetWindowInfo(browser.Identifier()); winInfo != nil {
//开发者工具和显示源代码不展示自定义默认菜单
if winInfo.WindowType() == WT_DEV_TOOLS || winInfo.WindowType() == WT_VIEW_SOURCE {
return
}
}
undoVisible, undoEnabled := model.IsVisible(MENU_ID_UNDO), model.IsEnabled(MENU_ID_UNDO)
redoVisible, redoEnabled := model.IsVisible(MENU_ID_REDO), model.IsEnabled(MENU_ID_REDO)
cutVisible, cutEnabled := model.IsVisible(MENU_ID_CUT), model.IsEnabled(MENU_ID_CUT)
copyVisible, copyEnabled := model.IsVisible(MENU_ID_COPY), model.IsEnabled(MENU_ID_COPY)
pasteVisible, pasteEnabled := model.IsVisible(MENU_ID_PASTE), model.IsEnabled(MENU_ID_PASTE)
selectAllVisible, selectAllEnabled := model.IsVisible(MENU_ID_SELECT_ALL), model.IsEnabled(MENU_ID_SELECT_ALL)
model.Clear()
if undoVisible {
undoId = MENU_ID_UNDO //model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: undoId,
Text: "撤销",
Accelerator: "ctrl+z",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.GetFocusedFrame().Undo()
},
})
model.SetEnabled(undoId, undoEnabled)
}
if redoVisible {
redoId = MENU_ID_REDO //model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: redoId,
Text: "恢复",
Accelerator: "ctrl+shift+z",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.GetFocusedFrame().Redo()
},
})
model.SetEnabled(redoId, redoEnabled)
}
if undoVisible && redoVisible {
model.AddSeparator()
}
if cutVisible {
cutId = MENU_ID_CUT //model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: cutId,
Text: "剪切",
Accelerator: "ctrl+x",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.GetFocusedFrame().Cut()
},
})
model.SetEnabled(cutId, cutEnabled)
}
if copyVisible {
copyId = MENU_ID_COPY //model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: copyId,
Text: "复制",
Accelerator: "ctrl+c",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.GetFocusedFrame().Copy()
},
})
model.SetEnabled(copyId, copyEnabled)
}
if pasteVisible {
pasteId = MENU_ID_PASTE //model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: pasteId,
Text: "粘贴",
Accelerator: "ctrl+v",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.GetFocusedFrame().Paste()
},
})
model.SetEnabled(pasteId, pasteEnabled)
}
if selectAllVisible {
selectAllId = MENU_ID_SELECT_ALL //model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: selectAllId,
Text: "全选",
Accelerator: "ctrl+a",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.GetFocusedFrame().SelectAll()
},
})
model.SetEnabled(pasteId, selectAllEnabled)
}
if cutVisible && copyVisible && pasteVisible && selectAllVisible {
model.AddSeparator()
}
//A标签和图片 链接
if params.TypeFlags == 5 && params.MediaType == CM_MEDIATYPE_NONE { //a=5
aUrlId = model.CefMis.NextCommandId()
model.AddItem(aUrlId, "复制链接")
}
if params.TypeFlags == 9 && params.MediaType == CM_MEDIATYPE_IMAGE { // image=9
//copyImageId = model.CefMis.NextCommandId()
//model.AddItem(copyImageId, "复制图片")
imageUrlId = model.CefMis.NextCommandId()
model.AddItem(imageUrlId, "复制图片链接")
imageSaveId = model.CefMis.NextCommandId()
model.AddItem(imageSaveId, "图片另存为")
}
if (params.TypeFlags == 5 && params.MediaType == CM_MEDIATYPE_NONE) || params.TypeFlags == 9 && params.MediaType == CM_MEDIATYPE_IMAGE {
model.AddSeparator()
}
//A标签和图片 链接
backId = model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: backId,
Text: "返回",
Accelerator: "alt+" + string(rune(37)),
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
if browser.CanGoBack() {
QueueAsyncCall(func(id int) {
browser.GoBack()
})
}
},
})
forwardId = model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: forwardId,
Text: "前进",
Accelerator: "alt+" + string(rune(39)),
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
if browser.CanGoForward() {
QueueAsyncCall(func(id int) {
browser.GoForward()
})
}
},
})
model.AddSeparator()
printId = model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: printId,
Text: "打印",
Accelerator: "ctrl+p",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.Print()
},
})
model.AddSeparator()
closeBrowserId = model.CefMis.NextCommandId()
model.AddItem(closeBrowserId, "关闭页面")
model.AddSeparator()
refreshId = model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: refreshId,
Text: "刷新",
Accelerator: "ctrl+r",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.Reload()
},
})
forcedRefreshId = model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: forcedRefreshId,
Text: "强制刷新",
Accelerator: "shift+ctrl+r",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.ReloadIgnoreCache()
},
})
model.AddSeparator()
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableViewSource) {
viewSourceId = model.CefMis.NextCommandId()
model.AddMenuItem(&MenuItem{
CommandId: viewSourceId,
Text: "查看网面源代码",
Accelerator: "ctrl+u",
Callback: func(browser *ICefBrowser, commandId MenuId, params *ICefContextMenuParams, menuType TCefContextMenuType, eventFlags uint32, result *bool) {
browser.ViewSource(frame)
},
})
}
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableDevTools) {
devToolsId = model.CefMis.NextCommandId()
model.AddItem(devToolsId, "开发者工具(F12)")
}
if browser.CanGoBack() {
model.SetEnabled(backId, true)
} else {
model.SetEnabled(backId, false)
}
if browser.CanGoForward() {
model.SetEnabled(forwardId, true)
} else {
model.SetEnabled(forwardId, false)
}
}
func chromiumOnContextMenuCommand(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, commandId MenuId, eventFlags uint32, result *bool) {
defer func() {
if err := recover(); err != nil {
logger.Error("OnContextMenuCommand Error:", err)
}
}()
*result = true
if commandId == backId {
browser.GoBack()
} else if commandId == forwardId {
browser.GoForward()
} else if commandId == printId {
browser.Print()
} else if commandId == closeBrowserId {
winInfo := BrowserWindow.GetWindowInfo(browser.Identifier())
winInfo.CloseBrowserWindow()
} else if commandId == refreshId {
browser.Reload()
} else if commandId == forcedRefreshId {
browser.ReloadIgnoreCache()
} else if commandId == viewSourceId {
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableViewSource) {
browser.ViewSource(frame)
}
} else if commandId == devToolsId {
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableDevTools) {
browser.ShowDevTools()
}
} else if commandId == aUrlId {
QueueAsyncCall(func(id int) {
lcl.Clipboard.SetAsText(params.LinkUrl)
})
} else if commandId == copyImageId {
frame.Copy()
} else if commandId == imageUrlId {
QueueAsyncCall(func(id int) {
lcl.Clipboard.SetAsText(params.SourceUrl)
})
} else if commandId == imageSaveId {
browser.StartDownload(params.SourceUrl)
}
*result = true
}