Custom MenuView

You can customize the built-in context menu by adding or removing items from the MenuView.

Description
app.js
index.html
styles.css
Copy to CodeMine

You can rewrite the defined context menu style class to apply different styles. For example:

    .gc-ui-contextmenu-group-header {
            font-weight:normal;
            background-color:none;
    }

You can customize the menu item's view structure by overwriting the MenuView's createMenuItemElement function:

    var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'));
    function CustomMenuView() {}
    CustomMenuView.prototype = new GC.Spread.Sheets.ContextMenu.MenuView();
    CustomMenuView.prototype.createMenuItemElement = function (menuItemData) {
        // create menu item view by your self
        // you can call super's createMenuItemElement here and only customize a few of menu item
        // should return menu item view back
    };
    spread.contextMenu.menuView = new CustomMenuView();

You can overwrite the MenuView's getCommandOptions function to show the options when the command is executed:

    var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'));
    function CustomMenuView() {}
    CustomMenuView.prototype = new GC.Spread.Sheets.ContextMenu.MenuView();
    CustomMenuView.prototype.getCommandOptions = function (menuItemData, host, event) {
        // For most of the menu items, only the selections on sheets or the active sheet’s name are needed
        // but there may be some menu items need special parameters,like color picker,change color
        // To change colors, the command needs to know which color the user clicked on, so overwrite this function and return this
        // parameter's value here.
    };
    spread.contextMenu.menuView = new CustomMenuView();
You can rewrite the defined context menu style class to apply different styles. For example: You can customize the menu item's view structure by overwriting the MenuView's createMenuItemElement function: You can overwrite the MenuView's getCommandOptions function to show the options when the command is executed:
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2}); initEvents(spread); }; function initEvents(spread) { document.getElementById('addMoreMenuItems').onchange = function () { if (isMenuItemExist(spread.contextMenu.menuData, "selectColorWithBg") || isMenuItemExist(spread.contextMenu.menuData, "insertRows")) { spread.contextMenu.menuData.forEach(function (item, index) { if (item && (item.name === "selectColorWithBg" || item.name === "insertRows")) { spread.contextMenu.menuData.splice(index, 1); } }); return; } var commandManager = spread.commandManager(); // prepair select with a background color command and menu item var selectWithABackgroundColor = { text: "Select Color", name: "selectColorWithBg", workArea: "viewport", subMenu: [ { name: "selectColorPicker", command: "selectWithBg" } ] }; spread.contextMenu.menuData.push(selectWithABackgroundColor); var selectWithABackgroundColorCommand = { canUndo: false, execute: function (spread, options) { if (options.commandOptions) { var style = new GC.Spread.Sheets.Style(); style.name = 'style1'; style.backColor = options.commandOptions; var sheet = spread.getActiveSheet(); sheet.suspendPaint(); var selections = sheet.getSelections(); var selectionIndex = 0, selectionCount = selections.length; for (; selectionIndex < selectionCount; selectionIndex++) { var selection = selections[selectionIndex]; for (var i = selection.row; i < (selection.row + selection.rowCount); i++) { for (var j = selection.col; j < (selection.col + selection.colCount); j++) { sheet.setStyle(i, j, style, GC.Spread.Sheets.SheetArea.viewport); } } } sheet.resumePaint(); } } }; commandManager.register("selectWithBg", selectWithABackgroundColorCommand, null, false, false, false, false); // prepair insert rows by specified row count command and menu item var insertRows = { text: "insertRows", name: "insertRows", command: "insertRows", workArea: "rowHeader" }; spread.contextMenu.menuData.push(insertRows); var insertRowsCommand = { canUndo: false, execute: function (spread, options) { var rowCount = parseInt(options.commandOptions); if (!isNaN(rowCount)) { var sheet = spread.getSheetFromName(options.sheetName); sheet.suspendPaint(); sheet.addRows(options.activeRow, rowCount); sheet.resumePaint(); } } }; commandManager.register("insertRows", insertRowsCommand, null, false, false, false, false); // customize context menu function CustomMenuView() { } CustomMenuView.prototype = new GC.Spread.Sheets.ContextMenu.MenuView(); CustomMenuView.prototype.createMenuItemElement = function (menuItemData) { var self = this; if (menuItemData.name === "selectColorPicker") { var containers = GC.Spread.Sheets.ContextMenu.MenuView.prototype.createMenuItemElement.call(self, menuItemData); var supMenuItemContainer = containers[0]; while (supMenuItemContainer.firstChild) { supMenuItemContainer.removeChild(supMenuItemContainer.firstChild); } var colorPicker = createColorpicker(); supMenuItemContainer.appendChild(colorPicker); return supMenuItemContainer; } else if (menuItemData.name === "insertRows") { var containers = GC.Spread.Sheets.ContextMenu.MenuView.prototype.createMenuItemElement.call(self, menuItemData); var supMenuItemContainer = containers[0]; supMenuItemContainer.appendChild(createInput()); return supMenuItemContainer; } else { var menuItemView = GC.Spread.Sheets.ContextMenu.MenuView.prototype.createMenuItemElement.call(self, menuItemData); return menuItemView; } }; CustomMenuView.prototype.getCommandOptions = function (menuItemData, host, event) { if (menuItemData && menuItemData.name === "selectColorPicker") { var ele = event.target || event.srcElement; return ele.style.backgroundColor; } else if (menuItemData && menuItemData.name === "insertRows") { return host.getElementsByClassName("inputBlock")[0].value; } }; spread.contextMenu.menuView = new CustomMenuView(); }; var colors = ['rgb(255,255,255)', 'rgb(0,255,255)', 'rgb(255,0,255)', 'rgb(255,255,0)', 'rgb(255,0,0)', 'rgb(0,255,0)', 'rgb(0,0,255)', 'rgb(0,0,0)']; function createColorpicker() { var colorPicker = document.createElement('div'); colorPicker.className = 'colorPickerContent'; for (var j = 0; j < 8; j++) { var colorDom = document.createElement("div"); colorDom.className = 'colorDom'; colorDom.style['backgroundColor'] = colors[j]; colorPicker.appendChild(colorDom); } return colorPicker; } } function createInput() { var inputBlock = document.createElement('input'); inputBlock.className = 'inputBlock'; inputBlock.type = 'text'; inputBlock.value = '1'; inputBlock.setAttribute('gcUIElement', 'gcContextMenu'); inputBlock.style = 'width: 20px'; inputBlock.onclick = function (ev) { if (ev.target) { ev.stopPropagation() } } return inputBlock; } function isMenuItemExist(menuData, menuItemName) { var i = 0, count = menuData.length; for (; i < count; i++) { if (menuItemName === menuData[i].name) { return true; } } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> <div class="options-container"> <div class="option-row"> Right click any cell to bring up the context menu.You can easily modify the context menu depending on your needs. Select the option below to add a new context menu item on viewport that will allow the user to change the background color of the cell and a new context menu item on rowHeader that will allow the user to add row count by specified number.<br/> <div class="option-row"> <input id="addMoreMenuItems" type="checkbox" /> <label for="addMoreMenuItems">Add more menu items</label> </div> </div> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; margin-top: 10px; } label { margin-bottom: 6px; } input { padding: 4px 6px; } input[type=button] { margin-top: 6px; } .buttonStyle{ width:240px; height:30px; } .colorPickerContent{ width: 100%; background-color:white; } .colorDom{ width: 14px; height: 14px; margin:0 0 0 6px; display: inline-block; border: solid 1px #333333; vertical-align: top; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }