From bb7f081dcf861799e70ef17f11e77f0e790d61c2 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 1 Jun 2022 22:49:52 +0300 Subject: [PATCH] [DE] For Bug 42393 --- apps/common/main/lib/core/keymaster.js | 24 ++++-- apps/common/main/lib/util/Shortcuts.js | 4 +- .../main/app/controller/DocumentHolder.js | 75 +++++++++++++++++-- .../main/app/controller/LeftMenu.js | 1 + 4 files changed, 90 insertions(+), 14 deletions(-) diff --git a/apps/common/main/lib/core/keymaster.js b/apps/common/main/lib/core/keymaster.js index 29a5b1502b..fcf1c05ead 100644 --- a/apps/common/main/lib/core/keymaster.js +++ b/apps/common/main/lib/core/keymaster.js @@ -36,7 +36,8 @@ return _MAP[x] || x.toUpperCase().charCodeAt(0); }, _downKeys = []; - var locked; + var locked, + propagate; for(k=1;k<20;k++) _MAP['f'+k] = 111+k; @@ -116,6 +117,8 @@ // call the handler and stop the event if neccessary if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ if(locked===true || handler.locked || handler.method(event, handler)===false){ + if (locked===true && propagate || handler.locked && handler.propagate) + continue; if(event.preventDefault) event.preventDefault(); else event.returnValue = false; if(event.stopPropagation) event.stopPropagation(); @@ -320,12 +323,23 @@ } } - function suspend(key, scope) { - key ? setKeyOptions(key, scope, 'locked', true) : (locked = true); + function suspend(key, scope, pass) { + if (key) { + setKeyOptions(key, scope, 'locked', true) + pass && setKeyOptions(key, scope, 'propagate', true) + } else { + locked = true; + pass && (propagate = true); + } } - function resume(key, scope) { - key ? setKeyOptions(key, scope, 'locked', false) : (locked = false); + function resume(key, scope) { + if (key) { + setKeyOptions(key, scope, 'locked', false) + setKeyOptions(key, scope, 'propagate', false) + } else { + locked = propagate = false; + } } // set window.key and window.key.set/get/deleteScope, and the default filter diff --git a/apps/common/main/lib/util/Shortcuts.js b/apps/common/main/lib/util/Shortcuts.js index f34ae1ce52..de36581ce7 100644 --- a/apps/common/main/lib/util/Shortcuts.js +++ b/apps/common/main/lib/util/Shortcuts.js @@ -148,8 +148,8 @@ Common.util = Common.util||{}; } }, - suspendEvents: function(key,scope) { - window.key.suspend(key,scope); + suspendEvents: function(key,scope,propagate) { + window.key.suspend(key,scope,propagate); }, resumeEvents: function(key,scope) { diff --git a/apps/documenteditor/main/app/controller/DocumentHolder.js b/apps/documenteditor/main/app/controller/DocumentHolder.js index 5263b98d14..b75c2a01c8 100644 --- a/apps/documenteditor/main/app/controller/DocumentHolder.js +++ b/apps/documenteditor/main/app/controller/DocumentHolder.js @@ -143,7 +143,8 @@ define([ me.userTooltip = true; me.wrapEvents = { userTipMousover: _.bind(me.userTipMousover, me), - userTipMousout: _.bind(me.userTipMousout, me) + userTipMousout: _.bind(me.userTipMousout, me), + onKeyUp: _.bind(me.onKeyUp, me) }; var keymap = {}; @@ -642,6 +643,9 @@ define([ var me = this; if (me.api){ var key = event.keyCode; + if (me.hkSpecPaste) { + me._needShowSpecPasteMenu = !event.shiftKey && !event.altKey && event.keyCode == Common.UI.Keys.CTRL; + } if ((event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey){ if (key === Common.UI.Keys.NUM_PLUS || key === Common.UI.Keys.EQUALITY || (Common.Utils.isGecko && key === Common.UI.Keys.EQUALITY_FF) || (Common.Utils.isOpera && key == 43)){ me.api.zoomIn(); @@ -1086,8 +1090,10 @@ define([ parentEl: $('#id-document-holder-btn-special-paste'), cls : 'btn-toolbar', iconCls : 'toolbar__icon btn-paste', + caption : Common.Utils.String.platformKey('Ctrl', '({0})'), menu : new Common.UI.Menu({items: []}) }); + me.initSpecialPasteEvents(); } if (pasteItems.length>0) { @@ -1100,20 +1106,18 @@ define([ var group_prev = -1; _.each(pasteItems, function(menuItem, index) { var mnu = new Common.UI.MenuItem({ - caption: me._arrSpecialPaste[menuItem], + caption: me._arrSpecialPaste[menuItem] + ' (' + me.hkSpecPaste[menuItem] + ')', value: menuItem, checkable: true, toggleGroup : 'specialPasteGroup' - }).on('click', function(item, e) { - me.api.asc_SpecialPaste(item.value); - setTimeout(function(){menu.hide();}, 100); - }); + }).on('click', _.bind(me.onSpecialPasteItemClick, me)); menu.addItem(mnu); }); (menu.items.length>0) && menu.items[0].setChecked(true, true); } if (coord.asc_getX()<0 || coord.asc_getY()<0) { if (pasteContainer.is(':visible')) pasteContainer.hide(); + $(document).off('keyup', this.wrapEvents.onKeyUp); } else { var showPoint = [coord.asc_getX() + coord.asc_getWidth() + 3, coord.asc_getY() + coord.asc_getHeight() + 3]; if (!Common.Utils.InternalSettings.get("de-hidden-rulers")) { @@ -1121,13 +1125,54 @@ define([ } pasteContainer.css({left: showPoint[0], top : showPoint[1]}); pasteContainer.show(); + setTimeout(function() { + $(document).on('keyup', me.wrapEvents.onKeyUp); + }, 10); } }, onHideSpecialPasteOptions: function() { var pasteContainer = this.documentHolder.cmpEl.find('#special-paste-container'); - if (pasteContainer.is(':visible')) + if (pasteContainer.is(':visible')) { pasteContainer.hide(); + $(document).off('keyup', this.wrapEvents.onKeyUp); + } + }, + + onKeyUp: function (e) { + if (e.keyCode == Common.UI.Keys.CTRL && this._needShowSpecPasteMenu && !this.btnSpecialPaste.menu.isVisible() && /area_id/.test(e.target.id)) { + $('button', this.btnSpecialPaste.cmpEl).click(); + e.preventDefault(); + } + this._needShowSpecPasteMenu = false; + }, + + initSpecialPasteEvents: function() { + var me = this; + me.hkSpecPaste = []; + me.hkSpecPaste[Asc.c_oSpecialPasteProps.paste] = 'P'; + me.hkSpecPaste[Asc.c_oSpecialPasteProps.sourceformatting] = 'K'; + me.hkSpecPaste[Asc.c_oSpecialPasteProps.keepTextOnly] = 'T'; + me.hkSpecPaste[Asc.c_oSpecialPasteProps.insertAsNestedTable] = 'N'; + me.hkSpecPaste[Asc.c_oSpecialPasteProps.overwriteCells] = 'O'; + for(var key in me.hkSpecPaste){ + if(me.hkSpecPaste.hasOwnProperty(key)){ + var keymap = {}; + keymap[me.hkSpecPaste[key]] = _.bind(me.onSpecialPasteItemClick, me, {value: parseInt(key)}); + Common.util.Shortcuts.delegateShortcuts({shortcuts:keymap}); + Common.util.Shortcuts.suspendEvents(me.hkSpecPaste[key], undefined, true); + } + } + + me.btnSpecialPaste.menu.on('show:after', function(menu) { + for (var i = 0; i < menu.items.length; i++) { + me.hkSpecPaste[menu.items[i].value] && Common.util.Shortcuts.resumeEvents(me.hkSpecPaste[menu.items[i].value]); + } + }).on('hide:after', function(menu) { + for (var i = 0; i < menu.items.length; i++) { + me.hkSpecPaste[menu.items[i].value] && Common.util.Shortcuts.suspendEvents(me.hkSpecPaste[menu.items[i].value], undefined, true); + } + }); }, onDoubleClickOnChart: function(chart) { @@ -2232,6 +2277,22 @@ define([ this.documentHolder.fireEvent('links:contents', [item.value, true]); }, + onSpecialPasteItemClick: function(item, e) { + if (this.api) { + this.api.asc_SpecialPaste(item.value); + var menu = this.btnSpecialPaste.menu; + if (!item.cmpEl) { + for (var i = 0; i < menu.items.length; i++) { + menu.items[i].setChecked(menu.items[i].value===item.value, true); + } + } + setTimeout(function(){ + menu.hide(); + }, 100); + } + return false; + }, + editComplete: function() { this.documentHolder && this.documentHolder.fireEvent('editcomplete', this.documentHolder); } diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index 6a8b5fef62..7fe92b6858 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -715,6 +715,7 @@ define([ case 'replace': case 'search': this.leftMenu.btnAbout.toggle(false); + Common.UI.Menu.Manager.hideAll(); var selectedText = this.api.asc_GetSelectedText(); if (this.isSearchPanelVisible()) { selectedText && this.leftMenu.panelSearch.setFindText(selectedText);