Ellia.Duan 发表于 2024-7-1 09:50:19

在线表格编辑器修改“文件”菜单(三)

本帖最后由 Ellia.Duan 于 2024-7-2 13:53 编辑

接上文介绍的内容,本文将介绍如何设置“打印”为默认选中,且只显示“打印”菜单。
我们先上最后的效果图,

那我们开始吧。
第一步,获取文件template
var fileMenuPanelTemplate = GC.Spread.Sheets.Designer.getTemplate(GC.Spread.Sheets.Designer.TemplateNames.FileMenuPanelTemplate);
第二步,遍历node
如同之前介绍的系列文章,我们将上述代码中fileMenuPanelTemplate 进行打印,在控制台中输出结果后,进行复制粘贴至新文本中,此时全局搜索“打印”

如上图所示,我们找到了“打印”的结点,以及找到了className为“gc-file-menu-category”的父节点。所以我们在遍历node结点时,可以查找className为“gc-file-menu-category”的结点,并对其遍历,删除子节点,仅保留第一个结点“后退”按钮以及最后一个按钮“打印”,
代码如下:
findNode(fileMenuPanelTemplate.content)

            function findNode(node) {
                if (node instanceof Array) {
                  for (let i = 0; i < node.length; i++) {
                        findNode(node)
                  }
                } else if (node.children) {
                  if (node.className == "gc-file-menu-category") { //左侧节点
                        node.children.splice(1, node.children.length - 2) //保留后退按钮和最后一个打印按钮
                  }
               
                  findNode(node.children)
                }
            }
上述代码便实现了左侧菜单只保留“后退”按钮和“打印”按钮的功能,我们重新注册一下,看下实际效果
注册代码:
GC.Spread.Sheets.Designer.registerTemplate(GC.Spread.Sheets.Designer.TemplateNames.FileMenuPanelTemplate, fileMenuPanelTemplate);
效果如下:

我们观察上图,左侧菜单实现了我们想要的效果,然后右侧显示的是默认的“新建”工作簿功能,不是我们想要的打印预览,此时该怎么办呢?
别着急,我们还是打开文本,查找“打印”,我们总共查找到两个结果,第一个是左侧菜单的“打印” ,第二个是右侧面板的“打印”,如下图所示:

我们同样,找到这个结点的父节点,

如上图所示,我们找到了className为“category-content-container”的父节点,我们将其子节点进行删除,仅保留“打印”预览功能。
代码如下:
findNode(fileMenuPanelTemplate.content)

            function findNode(node) {
                if (node instanceof Array) {
                  for (let i = 0; i < node.length; i++) {
                        findNode(node)
                  }
                } else if (node.children) {
                  if (node.className == "gc-file-menu-category") { //左侧节点
                        node.children.splice(1, node.children.length - 2) //保留后退按钮和最后一个打印按钮
                  }
                  else if (node.className == 'category-content-container') { //右侧节点
                        for (let i = 0; i < node.children.length; i++) {
                            let leaveNode = node.children
                            if (leaveNode.visibleWhen !== "activeCategory_main=Print") {
                              node.children.splice(i, 1)
                            }
                        }
                  }
                  findNode(node.children)
                }
            }

在上述代码中,我们查找了className为“category-content-container”的父节点,并遍历其children ,如果children的visibleWhen不等于"activeCategory_main=Print"则进行删除。
我们在当前代码基础上看下实际效果:

此时点击下“打印”,发现有内容

但是这个也不是我们想要的想过,我们想要,点击“文件” ,默认选中“打印”,此时又该怎么办呢?
我们需要获取“FileMenuPanel”命令,重写其getState方法
代码如下:
var fileMenuPanelCommand = GC.Spread.Sheets.Designer.getCommand(GC.Spread.Sheets.Designer.CommandNames.FileMenuPanel);
            var oldStatusFn = fileMenuPanelCommand.getState;
            fileMenuPanelCommand.getState = function () {
                var result = oldStatusFn.apply(this, arguments);
                result.activeCategory_main = "Print";
                result.printSetting.activeCategoryIsPrint = true;
                return result;
            }
            var config = GC.Spread.Sheets.Designer.DefaultConfig;
            config.commandMap = {
                fileMenuPanel: fileMenuPanelCommand
            }
我们重新setConfig后,再来看看效果,果然实现了。


最后的demo

刘博 发表于 2024-7-30 14:16:07

{:5_117:}有用

Ellia.Duan 发表于 2024-7-30 14:22:34

刘博 发表于 2024-7-30 14:16
有用

{:5_110:}
页: [1]
查看完整版本: 在线表格编辑器修改“文件”菜单(三)