2021-04-21 17:52:17 +00:00
/ *
*
* ( c ) Copyright Ascensio System SIA 2010 - 2021
*
* This program is a free software product . You can redistribute it and / or
* modify it under the terms of the GNU Affero General Public License ( AGPL )
* version 3 as published by the Free Software Foundation . In accordance with
* Section 7 ( a ) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non - infringement
* of any third - party rights .
*
* This program is distributed WITHOUT ANY WARRANTY ; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . For
* details , see the GNU AGPL at : http : //www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20 A - 12 Ernesta Birznieka - Upisha
* street , Riga , Latvia , EU , LV - 1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices , as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7 ( b ) of the License you must retain the original Product
* logo when distributing the program . Pursuant to Section 7 ( e ) we decline to
* grant you any rights under trademark law for use of our trademarks .
*
* All the Product ' s GUI elements , including illustrations and icon sets , as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution - ShareAlike 4.0 International . See the License
* terms at http : //creativecommons.org/licenses/by-sa/4.0/legalcode
*
* /
/ * *
* HintManager . js
*
* Created by Julia Radzhabova on 21.04 . 2021
* Copyright ( c ) 2021 Ascensio System SIA . All rights reserved .
*
* /
2021-07-13 11:43:54 +00:00
/ * *
* Example usage with simple items :
*
* < button ... data - hint = "1" data - hint - direction = "right" data - hint - offset = "big" data - hint - title = "B" > ... < / b u t t o n >
* < label ... data - hint = "1" data - hint - direction = "bottom" data - hint - offset = "medium" data - hint - title = "L" > ... < / l a b e l >
*
* Example usage with components :
*
* new Common . UI . Button ( {
* ...
* dataHint : '1' , // '0' - tabs in toolbar, left and right menu, statusbar;
* // '1' - file menu, contents of toolbar tabs, contents of right and left panels
* dataHintDirection : 'bottom' , // top, bottom, right, left, left-top
* dataHintOffset : 'small' , // big - 6px, medium - 4px, small - 2px
* dataHintTitle : 'S'
* } ) ;
*
* new Common . UI . CheckBox ( {
* ...
* dataHint : '1' ,
* dataHintDirection : 'left' ,
* dataHintOffset : 'small'
* } ) ;
*
* new Common . UI . ComboBox ( {
* ...
* dataHint : '1' ,
* dataHintDirection : 'bottom' ,
* dataHintOffset : 'big'
* } ) ;
*
* new Common . UI . InputField ( {
* ...
* dataHint : '1' ,
* dataHintDirection : 'left' ,
* dataHintOffset : 'small'
* } ) ;
*
* new Common . UI . MetricSpinner ( {
* ...
* dataHint : '1' ,
* dataHintDirection : 'bottom' ,
* dataHintOffset : 'big'
* } ) ;
*
* new Common . UI . RadioBox ( {
* ...
* dataHint : '1' ,
* dataHintDirection : 'left' ,
* dataHintOffset : 'small'
* } ) ;
* /
2021-04-21 17:52:17 +00:00
if ( Common === undefined )
var Common = { } ;
if ( Common . UI === undefined ) {
Common . UI = { } ;
}
Common . UI . HintManager = new ( function ( ) {
2021-05-19 18:36:04 +00:00
var _lang = 'en' ,
2021-05-26 15:30:18 +00:00
_arrAlphabet = [ ] ,
2021-06-23 15:41:38 +00:00
_arrEnAlphabet = [ ] ,
2021-06-24 15:19:35 +00:00
_arrQwerty = [ ] ,
_arrEnQwerty = [ ] ,
2021-10-25 11:37:08 +00:00
_needShow = false ,
2021-04-21 17:52:17 +00:00
_hintVisible = false ,
2021-05-21 17:07:39 +00:00
_currentLevel = 0 ,
2021-05-30 11:16:33 +00:00
_currentSection = document ,
2021-04-21 17:52:17 +00:00
_currentControls = [ ] ,
2021-05-21 17:07:39 +00:00
_currentHints = [ ] ,
2021-07-08 17:20:34 +00:00
_inputLetters = '' ,
2021-07-12 16:33:05 +00:00
_isComplete = false ,
2021-07-13 09:02:06 +00:00
_isLockedKeyEvents = false ,
2021-11-15 12:47:39 +00:00
_inputTimer ,
2021-11-18 17:07:13 +00:00
_isDocReady = false ,
2021-12-20 17:36:55 +00:00
_isEditDiagram = false ,
_usedTitles = [ ] ;
2021-07-12 16:33:05 +00:00
var _api ;
2021-04-21 17:52:17 +00:00
2021-11-23 18:13:26 +00:00
var _setCurrentSection = function ( btn , section ) {
if ( section ) {
_currentSection = section ;
return ;
}
2021-05-30 11:16:33 +00:00
if ( btn === 'esc' ) {
if ( _currentLevel === 0 ) {
_currentSection = document ;
}
return ;
}
2021-11-18 17:07:13 +00:00
if ( _isEditDiagram ) {
_currentSection = [ $ ( window . parent . document ) . find ( '.advanced-settings-dlg' ) [ 0 ] , window . document ] ;
} else if ( $ ( '#file-menu-panel' ) . is ( ':visible' ) ) {
2021-05-30 11:16:33 +00:00
_currentSection = $ ( '#file-menu-panel' ) ;
} else {
2021-06-04 18:43:40 +00:00
_currentSection = ( btn && btn . closest ( '.hint-section' ) ) || document ;
2021-05-30 11:16:33 +00:00
}
} ;
2021-07-12 16:33:05 +00:00
var _lockedKeyEvents = function ( isLocked ) {
if ( _api ) {
_isLockedKeyEvents = isLocked ;
_api . asc _enableKeyEvents ( ! isLocked ) ;
}
} ;
2021-05-25 08:07:13 +00:00
var _showHints = function ( ) {
_inputLetters = '' ;
2021-12-22 23:00:22 +00:00
if ( _currentLevel === 0 ) {
Common . NotificationCenter . trigger ( 'toolbar:collapse' ) ;
}
2021-11-18 17:07:13 +00:00
if ( _currentHints . length === 0 || ( $ ( '#file-menu-panel' ) . is ( ':visible' || _isEditDiagram ) && _currentLevel === 1 ) ) {
2021-05-21 17:07:39 +00:00
_getHints ( ) ;
2021-06-04 18:43:40 +00:00
}
2021-05-25 08:07:13 +00:00
if ( _currentHints . length > 0 ) {
2021-07-12 16:33:05 +00:00
! _isLockedKeyEvents && _lockedKeyEvents ( true ) ;
2021-05-25 08:07:13 +00:00
_hintVisible = true ;
_currentHints . forEach ( function ( item ) {
2021-07-05 17:17:04 +00:00
item . show ( ) ;
2021-05-25 08:07:13 +00:00
} ) ;
2021-07-13 09:02:06 +00:00
_inputTimer = setInterval ( function ( ) {
if ( _inputLetters . length > 0 ) {
_inputLetters = '' ;
}
} , 5000 ) ;
2021-07-12 16:33:05 +00:00
} else {
2021-05-25 08:07:13 +00:00
_hintVisible = false ;
2021-07-12 16:33:05 +00:00
}
2021-05-25 08:07:13 +00:00
} ;
var _hideHints = function ( ) {
_hintVisible = false ;
_currentHints && _currentHints . forEach ( function ( item ) {
2021-11-30 13:56:14 +00:00
item . remove ( )
2021-05-25 08:07:13 +00:00
} ) ;
2021-07-13 09:02:06 +00:00
clearInterval ( _inputTimer ) ;
2021-05-25 08:07:13 +00:00
} ;
2021-11-23 18:13:26 +00:00
var _nextLevel = function ( level ) {
2021-05-25 08:07:13 +00:00
_removeHints ( ) ;
_currentHints . length = 0 ;
_currentControls . length = 0 ;
2021-11-23 18:13:26 +00:00
if ( level !== undefined ) {
_currentLevel = level ;
} else {
_currentLevel ++ ;
}
2021-05-25 08:07:13 +00:00
} ;
var _prevLevel = function ( ) {
_removeHints ( ) ;
_currentHints . length = 0 ;
_currentControls . length = 0 ;
_currentLevel -- ;
2021-04-21 17:52:17 +00:00
} ;
2021-05-26 15:30:18 +00:00
var _getLetters = function ( countButtons ) {
2021-12-20 17:36:55 +00:00
var arr = _arrAlphabet . slice ( ) ,
firstFreeLetter ,
ind ;
for ( var i = 0 ; i < _arrAlphabet . length , ! firstFreeLetter ; i ++ ) {
if ( _usedTitles . indexOf ( _arrAlphabet [ i ] ) === - 1 ) {
firstFreeLetter = _arrAlphabet [ i ] ;
ind = i ;
}
}
arr [ ind ] = firstFreeLetter + _arrAlphabet [ 0 ] ;
for ( var i = 0 ; arr . length < countButtons ; i ++ ) {
var addTip = firstFreeLetter + _arrAlphabet [ i ] ;
if ( addTip !== arr [ ind ] ) {
arr . push ( firstFreeLetter + _arrAlphabet [ i ] ) ;
}
2021-05-26 15:30:18 +00:00
}
return arr ;
} ;
2021-07-06 15:42:13 +00:00
var _isItemDisabled = function ( item ) {
return ( item . hasClass ( 'disabled' ) || item . parent ( ) . hasClass ( 'disabled' ) || item . attr ( 'disabled' ) ) ;
} ;
2021-04-21 17:52:17 +00:00
var _getControls = function ( ) {
_currentControls = [ ] ;
2021-12-20 17:36:55 +00:00
_usedTitles = [ ] ;
2021-11-18 17:07:13 +00:00
var arr = [ ] ,
arrItemsWithTitle = [ ] ;
if ( _ . isArray ( _currentSection ) ) {
_currentSection . forEach ( function ( section ) {
arr = arr . concat ( $ ( section ) . find ( '[data-hint=' + ( _currentLevel ) + ']' ) . toArray ( ) ) ;
arrItemsWithTitle = arrItemsWithTitle . concat ( $ ( section ) . find ( '[data-hint-title][data-hint=' + ( _currentLevel ) + ']' ) . toArray ( ) ) ;
} ) ;
} else {
arr = $ ( _currentSection ) . find ( '[data-hint=' + ( _currentLevel ) + ']' ) . toArray ( ) ;
arrItemsWithTitle = $ ( _currentSection ) . find ( '[data-hint-title][data-hint=' + ( _currentLevel ) + ']' ) . toArray ( ) ;
}
2021-05-20 17:02:11 +00:00
var visibleItems = arr . filter ( function ( item ) {
return $ ( item ) . is ( ':visible' ) ;
} ) ;
2021-11-18 17:07:13 +00:00
var visibleItemsWithTitle = arrItemsWithTitle . filter ( function ( item ) {
2021-06-24 15:19:35 +00:00
return $ ( item ) . is ( ':visible' ) ;
} ) ;
if ( visibleItems . length === visibleItemsWithTitle . length ) { // all buttons have data-hint-title
visibleItems . forEach ( function ( item ) {
var el = $ ( item ) ;
2021-12-06 18:05:18 +00:00
if ( _lang !== 'en' ) {
var title = el . attr ( 'data-hint-title' ) . toLowerCase ( ) ,
firstLetter = title . substr ( 0 , 1 ) ;
if ( _arrAlphabet . indexOf ( firstLetter ) === - 1 ) { // tip is in English
var newTip = '' ;
for ( var i = 0 ; i < title . length ; i ++ ) {
var letter = title . substr ( i , 1 ) ,
ind = _arrEnAlphabet . indexOf ( letter ) ;
newTip = newTip + _arrAlphabet [ ind ] . toUpperCase ( ) ;
}
el . attr ( 'data-hint-title' , newTip ) ;
}
}
2021-06-24 15:19:35 +00:00
_currentControls . push ( el ) ;
} ) ;
return ;
}
2021-05-26 15:30:18 +00:00
var _arrLetters = [ ] ;
if ( visibleItems . length > _arrAlphabet . length ) {
2021-12-20 17:36:55 +00:00
visibleItemsWithTitle . forEach ( function ( item ) {
var t = $ ( item ) . data ( 'hint-title' ) . toLowerCase ( ) ;
if ( _arrAlphabet . indexOf ( t ) === - 1 ) {
var ind = _arrEnAlphabet . indexOf ( t ) ;
t = _arrAlphabet [ ind ] ;
}
_usedTitles . push ( t ) ;
} ) ;
2021-05-26 15:30:18 +00:00
_arrLetters = _getLetters ( visibleItems . length ) ;
} else {
2021-07-23 09:56:58 +00:00
_arrLetters = _arrAlphabet . slice ( ) ;
2021-05-20 17:02:11 +00:00
}
2021-06-23 15:41:38 +00:00
var usedLetters = [ ] ;
2021-11-18 17:07:13 +00:00
if ( arrItemsWithTitle . length > 0 ) {
2021-06-23 15:41:38 +00:00
visibleItems . forEach ( function ( item ) {
var el = $ ( item ) ;
var title = el . attr ( 'data-hint-title' ) ;
if ( title ) {
var ind = _arrEnAlphabet . indexOf ( title . toLowerCase ( ) ) ;
2021-06-24 15:19:35 +00:00
if ( ind === - 1 ) { // we have already changed
usedLetters . push ( _arrAlphabet . indexOf ( title . toLowerCase ( ) ) ) ;
} else {
usedLetters . push ( ind ) ;
if ( _lang !== 'en' ) {
el . attr ( 'data-hint-title' , _arrLetters [ ind ] . toUpperCase ( ) ) ;
}
2021-06-23 15:41:38 +00:00
}
}
} ) ;
}
var index = 0 ;
visibleItems . forEach ( function ( item ) {
2021-05-20 17:02:11 +00:00
var el = $ ( item ) ;
2021-07-05 17:17:04 +00:00
while ( usedLetters . indexOf ( index ) !== - 1 ) {
2021-06-23 15:41:38 +00:00
index ++ ;
}
var title = el . attr ( 'data-hint-title' ) ;
if ( ! title ) {
el . attr ( 'data-hint-title' , _arrLetters [ index ] . toUpperCase ( ) ) ;
index ++ ;
}
2021-05-20 17:02:11 +00:00
_currentControls . push ( el ) ;
2021-04-21 17:52:17 +00:00
} ) ;
} ;
var _getHints = function ( ) {
2021-11-18 17:07:13 +00:00
var docH = _isEditDiagram ? ( window . parent . innerHeight * Common . Utils . zoom ( ) ) : ( Common . Utils . innerHeight ( ) - 20 ) ,
docW = _isEditDiagram ? ( window . parent . innerWidth * Common . Utils . zoom ( ) ) : ( Common . Utils . innerWidth ( ) ) ,
section = _isEditDiagram ? _currentSection [ 0 ] : _currentSection ,
topSection = _currentLevel !== 0 && $ ( section ) . length > 0 && ! _isEditDiagram ? $ ( section ) . offset ( ) . top : 0 ,
bottomSection = _currentLevel !== 0 && $ ( section ) . length > 0 && ! _isEditDiagram ? topSection + $ ( section ) . height ( ) : docH ;
2021-12-09 16:24:10 +00:00
if ( $ ( section ) . prop ( 'id' ) === 'toolbar' && $ ( section ) . outerHeight ( ) < $ ( section ) . find ( '.box-controls' ) . outerHeight ( ) ) {
bottomSection += $ ( section ) . find ( '.box-controls' ) . outerHeight ( ) ;
}
2021-08-17 12:40:14 +00:00
2021-05-25 08:07:13 +00:00
if ( _currentControls . length === 0 )
_getControls ( ) ;
2021-04-21 17:52:17 +00:00
_currentControls . forEach ( function ( item , index ) {
2021-07-06 15:42:13 +00:00
if ( ! _isItemDisabled ( item ) ) {
2021-08-17 13:55:46 +00:00
var leftBorder = 0 ,
rightBorder = docW ;
2021-11-25 11:43:18 +00:00
if ( ! _isEditDiagram && $ ( _currentSection ) . prop ( 'id' ) === 'toolbar' && ( $ ( _currentSection ) . find ( '.toolbar-mask' ) . length > 0 || item . closest ( '.group' ) . find ( '.toolbar-group-mask' ) . length > 0 )
|| ( $ ( '#about-menu-panel' ) . is ( ':visible' ) && item . closest ( '.hint-section' ) . prop ( 'id' ) === 'right-menu' ) ) { // don't show right menu hints when about is visible
2021-07-06 15:42:13 +00:00
return ;
}
2021-07-05 17:17:04 +00:00
if ( window . SSE && item . parent ( ) . prop ( 'id' ) === 'statusbar_bottom' ) {
var $statusbar = item . parent ( ) ;
if ( item . offset ( ) . left > $statusbar . offset ( ) . left + $statusbar . width ( ) ) {
return ;
}
}
2021-08-17 13:55:46 +00:00
if ( _currentLevel === 0 && item . closest ( '.tabs.short' ) . length > 0 ) {
var blockTabs = item . closest ( '.tabs.short' ) ;
leftBorder = blockTabs . offset ( ) . left ;
rightBorder = leftBorder + blockTabs . width ( ) ;
if ( ! item . hasClass ( 'scroll' ) ) {
leftBorder += 20 ;
rightBorder -= 20 ;
}
}
2021-05-25 08:07:13 +00:00
var hint = $ ( '<div style="" class="hint-div">' + item . attr ( 'data-hint-title' ) + '</div>' ) ;
var direction = item . attr ( 'data-hint-direction' ) ;
2021-06-23 15:41:38 +00:00
// exceptions
2021-11-18 17:07:13 +00:00
if ( window . SSE && ! _isEditDiagram && _currentSection . nodeType !== 9 &&
2021-06-23 15:41:38 +00:00
_currentSection . prop ( 'id' ) === 'toolbar' && item . closest ( '.panel' ) . attr ( 'data-tab' ) === 'data' ) {
if ( item . parent ( ) . hasClass ( 'slot-sortdesc' ) || item . parent ( ) . hasClass ( 'slot-btn-setfilter' ) ) {
direction = 'top' ;
item . attr ( 'data-hint-direction' , 'top' ) ;
} else if ( item . parent ( ) . hasClass ( 'slot-btn-clear-filter' ) || item . parent ( ) . hasClass ( 'slot-sortasc' ) ) {
direction = 'bottom' ;
item . attr ( 'data-hint-direction' , 'bottom' ) ;
}
}
2021-08-12 12:39:47 +00:00
var maxHeight = docH ;
if ( $ ( '#file-menu-panel' ) . is ( ':visible' ) && _currentLevel > 1 &&
( $ ( '.fms-flex-apply' ) . is ( ':visible' ) || $ ( '#fms-flex-apply' ) . is ( ':visible' ) ) &&
item . closest ( '.fms-flex-apply' ) . length < 1 && item . closest ( '#fms-flex-apply' ) . length < 1 ) {
maxHeight = docH - $ ( '.fms-flex-apply' ) . height ( ) ;
}
2021-06-01 17:07:24 +00:00
var offsets = item . attr ( 'data-hint-offset' ) ;
var applyOffset = offsets === 'big' ? 6 : ( offsets === 'medium' ? 4 : ( offsets === 'small' ? 2 : 0 ) ) ;
if ( applyOffset ) {
switch ( direction ) {
case 'bottom' :
offsets = [ - applyOffset , 0 ] ;
break ;
case 'top' :
offsets = [ applyOffset , 0 ] ;
break ;
case 'right' :
offsets = [ 0 , - applyOffset ] ;
break ;
case 'left' :
offsets = [ 0 , applyOffset ] ;
break ;
}
} else {
2021-07-23 09:56:58 +00:00
offsets = offsets ? item . attr ( 'data-hint-offset' ) . split ( ',' ) . map ( function ( item ) { return parseInt ( item ) ; } ) : [ 0 , 0 ] ;
2021-06-01 17:07:24 +00:00
}
2021-05-25 08:07:13 +00:00
var offset = item . offset ( ) ;
2021-08-12 12:39:47 +00:00
var top , left ;
if ( direction === 'left-top' ) {
top = offset . top - 10 + offsets [ 0 ] ;
left = offset . left - 10 + offsets [ 1 ] ;
} else if ( direction === 'top' ) {
top = offset . top - 18 + offsets [ 0 ] ;
left = offset . left + ( item . outerWidth ( ) - 18 ) / 2 + offsets [ 1 ] ;
} else if ( direction === 'right' ) {
top = offset . top + ( item . outerHeight ( ) - 18 ) / 2 + offsets [ 0 ] ;
left = offset . left + item . outerWidth ( ) + offsets [ 1 ] ;
} else if ( direction === 'left' ) {
top = offset . top + ( item . outerHeight ( ) - 18 ) / 2 + offsets [ 0 ] ;
left = offset . left - 18 + offsets [ 1 ] ;
} else {
top = offset . top + item . outerHeight ( ) + offsets [ 0 ] ;
left = offset . left + ( item . outerWidth ( ) - 18 ) / 2 + offsets [ 1 ] ;
}
2021-08-17 13:55:46 +00:00
if ( top < maxHeight && left < docW && top > topSection && top < bottomSection && left > leftBorder && left + 18 < rightBorder ) {
2021-05-25 08:07:13 +00:00
hint . css ( {
2021-08-12 12:39:47 +00:00
top : top ,
left : left
2021-05-25 08:07:13 +00:00
} ) ;
2021-11-18 17:07:13 +00:00
if ( _isEditDiagram && index < 2 ) {
hint . css ( 'z-index' , '1060' ) ;
$ ( window . parent . document . body ) . append ( hint ) ;
} else {
$ ( document . body ) . append ( hint ) ;
}
2021-08-12 12:39:47 +00:00
}
2021-05-25 08:07:13 +00:00
_currentHints . push ( hint ) ;
}
2021-04-21 17:52:17 +00:00
} ) ;
} ;
var _removeHints = function ( ) {
_currentHints && _currentHints . forEach ( function ( item ) {
item . remove ( )
} ) ;
} ;
2021-06-04 18:43:40 +00:00
var _resetToDefault = function ( ) {
2021-11-18 17:07:13 +00:00
_currentLevel = ( $ ( '#file-menu-panel' ) . is ( ':visible' ) || _isEditDiagram ) ? 1 : 0 ;
2021-06-04 18:43:40 +00:00
_setCurrentSection ( ) ;
_currentHints . length = 0 ;
_currentControls . length = 0 ;
} ;
2021-07-12 16:33:05 +00:00
var _init = function ( api ) {
_api = api ;
2021-07-06 15:42:13 +00:00
Common . NotificationCenter . on ( {
'app:ready' : function ( mode ) {
2021-09-03 08:11:56 +00:00
var lang = mode . lang ? mode . lang . toLowerCase ( ) : 'en' ;
_getAlphabetLetters ( lang ) ;
2021-11-15 12:47:39 +00:00
_isDocReady = true ;
2021-07-06 15:42:13 +00:00
} ,
2021-08-13 18:05:41 +00:00
'hints:clear' : _clearHints ,
'window:resize' : _clearHints
2021-07-06 15:42:13 +00:00
} ) ;
2021-07-12 16:33:05 +00:00
$ ( '#editor_sdk' ) . on ( 'click' , function ( ) {
_clearHints ( ) ;
} ) ;
$ ( document ) . on ( 'mousedown' , function ( ) {
_clearHints ( ) ;
} ) ;
2021-04-21 17:52:17 +00:00
$ ( document ) . on ( 'keyup' , function ( e ) {
2021-11-24 19:06:49 +00:00
if ( e . keyCode == Common . UI . Keys . ALT && _needShow && ! ( window . SSE && window . SSE . getController ( 'Statusbar' ) . getIsDragDrop ( ) ) ) {
2021-04-21 17:52:17 +00:00
e . preventDefault ( ) ;
2021-05-25 08:07:13 +00:00
if ( ! _hintVisible ) {
2021-08-17 12:40:14 +00:00
$ ( 'input:focus' ) . blur ( ) ; // to change value in inputField
2021-11-18 17:07:13 +00:00
_currentLevel = ( $ ( '#file-menu-panel' ) . is ( ':visible' ) || _isEditDiagram ) ? 1 : 0 ;
2021-06-07 11:14:32 +00:00
_setCurrentSection ( ) ;
2021-05-25 08:07:13 +00:00
_showHints ( ) ;
} else {
_hideHints ( ) ;
2021-06-04 18:43:40 +00:00
_resetToDefault ( ) ;
2021-07-12 16:33:05 +00:00
if ( _isLockedKeyEvents ) {
_isLockedKeyEvents = false ;
_api . asc _enableKeyEvents ( true ) ;
}
2021-05-25 08:07:13 +00:00
}
2021-07-15 14:20:58 +00:00
} else if ( _hintVisible ) {
e . preventDefault ( ) ;
2021-04-21 17:52:17 +00:00
}
2021-10-25 11:37:08 +00:00
_needShow = false ;
2021-04-21 17:52:17 +00:00
} ) ;
$ ( document ) . on ( 'keydown' , function ( e ) {
if ( _hintVisible ) {
2021-07-15 14:20:58 +00:00
e . preventDefault ( ) ;
2021-04-21 17:52:17 +00:00
if ( e . keyCode == Common . UI . Keys . ESC ) {
2021-11-19 13:45:26 +00:00
setTimeout ( function ( ) {
if ( _currentLevel === 0 ) {
_hideHints ( ) ;
2021-12-17 11:22:47 +00:00
_resetToDefault ( ) ;
2021-11-19 13:45:26 +00:00
_lockedKeyEvents ( false ) ;
} else {
_prevLevel ( ) ;
_setCurrentSection ( 'esc' ) ;
_showHints ( ) ;
}
} , 10 ) ;
2021-06-23 15:41:38 +00:00
} else {
2021-12-02 16:47:03 +00:00
var curLetter = null ,
match = false ;
2021-07-15 14:20:58 +00:00
var keyCode = e . keyCode ;
if ( keyCode !== 16 && keyCode !== 17 && keyCode !== 18 && keyCode !== 91 ) {
curLetter = _lang === 'en' ? ( ( keyCode > 47 && keyCode < 58 || keyCode > 64 && keyCode < 91 ) ? String . fromCharCode ( e . keyCode ) : null ) : e . key ;
2021-06-24 15:19:35 +00:00
}
2021-07-15 14:20:58 +00:00
if ( curLetter ) {
var curr ;
if ( _lang !== 'en' && _arrAlphabet . indexOf ( curLetter . toLowerCase ( ) ) === - 1 ) {
var ind = _arrEnQwerty . indexOf ( curLetter . toLowerCase ( ) ) ;
if ( ind !== - 1 ) {
curLetter = _arrQwerty [ ind ] ;
}
2021-04-21 17:52:17 +00:00
}
2021-07-15 14:20:58 +00:00
_inputLetters = _inputLetters + curLetter . toUpperCase ( ) ;
for ( var i = 0 ; i < _currentControls . length ; i ++ ) {
var item = _currentControls [ i ] ;
2021-12-02 16:47:03 +00:00
if ( ! _isItemDisabled ( item ) ) {
var title = item . attr ( 'data-hint-title' ) ,
regExp = new RegExp ( '^' + _inputLetters + '' ) ;
if ( regExp . test ( title ) ) {
match = true ;
}
if ( title === _inputLetters ) {
curr = item ;
break ;
}
2021-06-07 11:14:32 +00:00
}
2021-07-15 14:20:58 +00:00
}
if ( curr ) {
var tag = curr . prop ( "tagName" ) . toLowerCase ( ) ;
if ( window . SSE && curr . parent ( ) . prop ( 'id' ) === 'statusbar_bottom' ) {
_hideHints ( ) ;
curr . contextmenu ( ) ;
2021-07-12 16:33:05 +00:00
_resetToDefault ( ) ;
2021-07-15 14:20:58 +00:00
} else if ( tag === 'input' || tag === 'textarea' ) {
_hideHints ( ) ;
curr . trigger ( jQuery . Event ( 'click' , { which : 1 } ) ) ;
curr . focus ( ) ;
2021-12-07 12:52:12 +00:00
_resetToDefault ( ) ;
} else if ( curr . hasClass ( 'listview' ) ) {
_hideHints ( ) ;
curr . focus ( ) ;
2021-07-15 14:20:58 +00:00
_resetToDefault ( ) ;
} else {
_isComplete = false ;
_hideHints ( ) ;
2021-11-18 17:07:13 +00:00
if ( ! _isEditDiagram && $ ( _currentSection ) . prop ( 'id' ) === 'toolbar' && ( $ ( _currentSection ) . find ( '.toolbar-mask' ) . length > 0 || curr . closest ( '.group' ) . find ( '.toolbar-group-mask' ) . length > 0 ) ) {
2021-07-16 14:31:09 +00:00
_resetToDefault ( ) ;
return ;
}
2021-11-23 18:13:26 +00:00
var needOpenPanel = ( curr . attr ( 'content-target' ) && ! $ ( '#' + curr . attr ( 'content-target' ) ) . is ( ':visible' ) ||
2021-12-09 16:24:10 +00:00
( curr . parent ( ) . prop ( 'id' ) === 'slot-btn-chat' && ! $ ( '#left-panel-chat' ) . is ( ':visible' ) ) ||
( curr . parent ( ) . hasClass ( 'ribtab' ) && ! $ ( '#toolbar' ) . children ( '.toolbar' ) . hasClass ( 'expanded' ) ) ) ;
2021-11-23 18:13:26 +00:00
if ( ( ! curr . attr ( 'content-target' ) && curr . parent ( ) . prop ( 'id' ) !== 'slot-btn-chat' ) || needOpenPanel ) { // need to open panel
2021-07-15 14:20:58 +00:00
if ( ! ( $ ( '#file-menu-panel' ) . is ( ':visible' ) && ( curr . parent ( ) . prop ( 'id' ) === 'fm-btn-info' && $ ( '#panel-info' ) . is ( ':visible' ) ||
curr . parent ( ) . prop ( 'id' ) === 'fm-btn-settings' && $ ( '#panel-settings' ) . is ( ':visible' ) ) ) ) {
if ( curr . attr ( 'for' ) ) { // to trigger event in checkbox
2021-07-23 10:42:20 +00:00
$ ( '#' + curr . attr ( 'for' ) ) . trigger ( jQuery . Event ( 'click' , { which : 1 } ) ) ;
2021-07-15 14:20:58 +00:00
} else {
curr . trigger ( jQuery . Event ( 'click' , { which : 1 } ) ) ;
2021-11-16 13:52:16 +00:00
if ( needOpenPanel )
_isComplete = false ; // to show next level of hints
2021-07-15 14:20:58 +00:00
}
}
}
2021-10-05 18:58:41 +00:00
if ( curr . prop ( 'id' ) === 'btn-goback' || curr . closest ( '.btn-slot' ) . prop ( 'id' ) === 'slot-btn-options' ||
curr . closest ( '.btn-slot' ) . prop ( 'id' ) === 'slot-btn-mode' || curr . prop ( 'id' ) === 'btn-favorite' || curr . parent ( ) . prop ( 'id' ) === 'tlb-box-users' ||
2021-12-03 13:45:12 +00:00
curr . prop ( 'id' ) === 'left-btn-thumbs' || curr . hasClass ( 'scroll' ) || curr . prop ( 'id' ) === 'left-btn-about' ||
curr . prop ( 'id' ) === 'left-btn-support' ) {
2021-07-15 14:20:58 +00:00
_resetToDefault ( ) ;
return ;
}
if ( curr . prop ( 'id' ) === 'add-comment-doc' ) {
_removeHints ( ) ;
_currentHints . length = 0 ;
_currentControls . length = 0 ;
_showHints ( ) ;
return ;
}
if ( ! _isComplete ) {
2021-11-23 18:13:26 +00:00
if ( curr . parent ( ) . prop ( 'id' ) === 'slot-btn-chat' ) {
_nextLevel ( 1 ) ;
_setCurrentSection ( undefined , $ ( '#left-menu.hint-section' ) ) ;
2021-12-03 12:38:00 +00:00
} else if ( curr . prop ( 'id' ) === 'id-right-menu-signature' ) {
_nextLevel ( 2 ) ;
_setCurrentSection ( curr ) ;
2021-11-23 18:13:26 +00:00
} else {
_nextLevel ( ) ;
_setCurrentSection ( curr ) ;
}
2021-07-15 14:20:58 +00:00
_showHints ( ) ;
2021-07-16 14:31:09 +00:00
if ( _currentHints . length < 1 ) {
_resetToDefault ( ) ;
}
2021-07-15 14:20:58 +00:00
}
2021-06-04 18:43:40 +00:00
}
2021-12-02 16:47:03 +00:00
} else if ( ! match ) {
_inputLetters = '' ;
2021-06-04 18:43:40 +00:00
}
2021-04-21 17:52:17 +00:00
}
}
}
2022-02-02 13:37:30 +00:00
_needShow = ( e . keyCode == Common . UI . Keys . ALT && ! Common . Utils . ModalWindow . isVisible ( ) && _isDocReady && _arrAlphabet . length > 0 ) ;
if ( e . altKey && e . keyCode !== 115 ) {
2021-11-29 15:09:23 +00:00
e . preventDefault ( ) ;
}
2021-04-21 17:52:17 +00:00
} ) ;
} ;
2021-09-03 08:11:56 +00:00
var _getAlphabetLetters = function ( lng ) {
2021-05-19 18:36:04 +00:00
Common . Utils . loadConfig ( '../../common/main/resources/alphabetletters/alphabetletters.json' , function ( langsJson ) {
2021-11-15 12:47:39 +00:00
_arrEnAlphabet = langsJson [ 'en' ] ;
2021-09-03 08:11:56 +00:00
var _setAlphabet = function ( lang ) {
_lang = lang ;
_arrAlphabet = langsJson [ lang ] ;
return _arrAlphabet ;
} ;
return ! _setAlphabet ( lng ) ? ( ! _setAlphabet ( lng . split ( /[\-_]/ ) [ 0 ] ) ? _setAlphabet ( 'en' ) : true ) : true ;
2021-05-19 18:36:04 +00:00
} ) ;
2021-06-24 15:19:35 +00:00
Common . Utils . loadConfig ( '../../common/main/resources/alphabetletters/qwertyletters.json' , function ( langsJson ) {
_arrQwerty = langsJson [ _lang ] ;
if ( _lang !== 'en' ) {
_arrEnQwerty = langsJson [ 'en' ] ;
}
} ) ;
2021-05-19 18:36:04 +00:00
} ;
2021-07-08 17:20:34 +00:00
var _needCloseFileMenu = function ( ) {
2021-05-27 16:30:48 +00:00
return ! ( _hintVisible && _currentLevel > 1 ) ;
} ;
2021-07-12 16:33:05 +00:00
var _clearHints = function ( isComplete ) {
_hintVisible && _hideHints ( ) ;
if ( _currentHints . length > 0 ) {
2021-07-06 15:42:13 +00:00
_resetToDefault ( ) ;
2021-07-12 16:33:05 +00:00
}
_isLockedKeyEvents && _lockedKeyEvents ( false ) ;
if ( isComplete ) {
_isComplete = true ;
2021-07-06 15:42:13 +00:00
}
2021-11-30 13:56:14 +00:00
if ( $ ( '.hint-div' ) . length > 0 ) {
$ ( '.hint-div' ) . remove ( ) ;
}
if ( $ ( 'iframe' ) . length > 0 ) {
$ ( 'iframe' ) . contents ( ) . find ( '.hint-div' ) . remove ( ) ;
}
2021-07-06 15:42:13 +00:00
} ;
2021-07-08 17:20:34 +00:00
var _isHintVisible = function ( ) {
return _hintVisible ;
} ;
2021-11-18 17:07:13 +00:00
var _setMode = function ( mode ) {
_isEditDiagram = mode . isEditDiagram ;
} ;
2021-04-21 17:52:17 +00:00
return {
2021-05-27 16:30:48 +00:00
init : _init ,
2021-11-18 17:07:13 +00:00
setMode : _setMode ,
2021-07-06 15:42:13 +00:00
clearHints : _clearHints ,
2021-07-08 17:20:34 +00:00
needCloseFileMenu : _needCloseFileMenu ,
isHintVisible : _isHintVisible
2021-04-21 17:52:17 +00:00
}
} ) ( ) ;