-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathWorkspaceManager.js
More file actions
1 lines (1 loc) · 8.21 KB
/
WorkspaceManager.js
File metadata and controls
1 lines (1 loc) · 8.21 KB
1
define(function(require,exports,module){const AppInit=require("utils/AppInit"),EventDispatcher=require("utils/EventDispatcher"),KeyBindingManager=require("command/KeyBindingManager"),Resizer=require("utils/Resizer"),PluginPanelView=require("view/PluginPanelView"),PanelView=require("view/PanelView"),EditorManager=require("editor/EditorManager"),KeyEvent=require("utils/KeyEvent"),EVENT_WORKSPACE_UPDATE_LAYOUT="workspaceUpdateLayout",EVENT_WORKSPACE_PANEL_SHOWN=PanelView.EVENT_PANEL_SHOWN,EVENT_WORKSPACE_PANEL_HIDDEN=PanelView.EVENT_PANEL_HIDDEN,MAIN_TOOLBAR_WIDTH=30;var $windowContent,$editorHolder,$mainToolbar;let $mainPluginPanel,$pluginIconsBar;var panelIDMap={},windowResizing=!1;let lastHiddenBottomPanelStack=[],lastShownBottomPanelStack=[];function calcAvailableHeight(){var availableHt=$windowContent.height();return $editorHolder.siblings().each(function(i,elem){var $elem=$(elem);"none"!==$elem.css("display")&&"absolute"!==$elem.css("position")&&(availableHt-=$elem.outerHeight())}),Math.max(availableHt,0)}function updateResizeLimits(){var editorAreaHeight=$editorHolder.height();$editorHolder.siblings().each(function(i,elem){var $elem=$(elem);"none"===$elem.css("display")?$elem.data("maxsize",editorAreaHeight):$elem.data("maxsize",editorAreaHeight+$elem.outerHeight())}),$mainToolbar.data("maxsize",.75*window.innerWidth)}function triggerUpdateLayout(refreshHint){let editorAreaHeight=calcAvailableHeight();$editorHolder.height(editorAreaHeight);let pluginPanelWidth=$mainToolbar.width()-$pluginIconsBar.width();$mainPluginPanel.width(pluginPanelWidth),exports.trigger(EVENT_WORKSPACE_UPDATE_LAYOUT,editorAreaHeight,refreshHint)}function handleWindowResize(){$windowContent&&$editorHolder&&(triggerUpdateLayout(),windowResizing||(windowResizing=!0,$(window.document).one("mousemove",function(){windowResizing=!1,updateResizeLimits()})))}function listenToResize($panel){$panel.on("panelCollapsed panelExpanded panelResizeUpdate",function(){triggerUpdateLayout()}),$panel.on("panelCollapsed panelExpanded panelResizeEnd",function(){updateResizeLimits()})}function createBottomPanel(id,$panel,minSize){$panel.insertBefore("#status-bar"),$panel.hide(),updateResizeLimits();let bottomPanel=new PanelView.Panel($panel,id);return panelIDMap[id]=bottomPanel,Resizer.makeResizable($panel[0],Resizer.DIRECTION_VERTICAL,Resizer.POSITION_TOP,minSize,!1,void 0,!0),listenToResize($panel),bottomPanel}function createPluginPanel(id,$panel,minSize,$toolbarIcon,initialSize){if(!$toolbarIcon)throw new Error("invalid $toolbarIcon provided to create createPluginPanel");$mainPluginPanel[0].appendChild($panel[0]);let pluginPanel=new PluginPanelView.Panel($panel,id,$toolbarIcon,minSize,initialSize);return panelIDMap[id]=pluginPanel,pluginPanel.hide(),pluginPanel}function getAllPanelIDs(){var property,panelIDs=[];for(property in panelIDMap)panelIDMap.hasOwnProperty(property)&&panelIDs.push(property);return panelIDs}function getPanelForID(panelID){return panelIDMap[panelID]}function recomputeLayout(refreshHint){triggerUpdateLayout(refreshHint),updateResizeLimits()}function _setMockDOM($mockWindowContent,$mockEditorHolder,$mockMainToolbar,$mockMainPluginPanel,$mockPluginIconsBar){$windowContent=$mockWindowContent,$editorHolder=$mockEditorHolder,$mainToolbar=$mockMainToolbar,$mainPluginPanel=$mockMainPluginPanel,$pluginIconsBar=$mockPluginIconsBar}AppInit.htmlReady(function(){$windowContent=$(".content"),$editorHolder=$("#editor-holder"),$mainToolbar=$("#main-toolbar"),$mainPluginPanel=$("#main-plugin-panel"),$pluginIconsBar=$("#plugin-icons-bar"),listenToResize($("#sidebar")),listenToResize($("#main-toolbar"))}),window.addEventListener("resize",handleWindowResize,!0),EventDispatcher.makeEventDispatcher(exports),PanelView.on(PanelView.EVENT_PANEL_SHOWN,(event,panelID)=>{lastHiddenBottomPanelStack=lastHiddenBottomPanelStack.filter(item=>item!==panelID),(lastShownBottomPanelStack=lastShownBottomPanelStack.filter(item=>item!==panelID)).push(panelID),exports.trigger(EVENT_WORKSPACE_PANEL_SHOWN,panelID)}),PanelView.on(PanelView.EVENT_PANEL_HIDDEN,(event,panelID)=>{(lastHiddenBottomPanelStack=lastHiddenBottomPanelStack.filter(item=>item!==panelID)).push(panelID),lastShownBottomPanelStack=lastShownBottomPanelStack.filter(item=>item!==panelID),exports.trigger(EVENT_WORKSPACE_PANEL_HIDDEN,panelID)});let currentlyShownPanel=null,panelShowInProgress=!1,initialSizeSetOnce={};function _getInitialSize(panel){let setOnce;if(!initialSizeSetOnce[panel.panelID])return initialSizeSetOnce[panel.panelID]=!0,panel.initialSize}function _showPluginSidePanel(panelID){let panelBeingShown=getPanelForID(panelID);Resizer.makeResizable($mainToolbar,Resizer.DIRECTION_HORIZONTAL,Resizer.POSITION_LEFT,panelBeingShown.minWidth,!1,void 0,!0,void 0,$windowContent,void 0,_getInitialSize(panelBeingShown)),Resizer.show($mainToolbar[0]),recomputeLayout(!0)}function _hidePluginSidePanel(){$mainToolbar.css("width",MAIN_TOOLBAR_WIDTH),$windowContent.css("right",MAIN_TOOLBAR_WIDTH),Resizer.removeSizable($mainToolbar[0]),recomputeLayout(!0)}function isPanelVisible(panelID){let panel=getPanelForID(panelID);return!(!panel||!panel.isVisible())}PluginPanelView.on(PluginPanelView.EVENT_PANEL_SHOWN,(event,panelID)=>{panelShowInProgress=!0,_showPluginSidePanel(panelID),currentlyShownPanel&¤tlyShownPanel.hide(),currentlyShownPanel=getPanelForID(panelID),exports.trigger(EVENT_WORKSPACE_PANEL_SHOWN,panelID),panelShowInProgress=!1}),PluginPanelView.on(PluginPanelView.EVENT_PANEL_HIDDEN,(event,panelID)=>{panelShowInProgress||(_hidePluginSidePanel(),currentlyShownPanel=null),exports.trigger(EVENT_WORKSPACE_PANEL_HIDDEN,panelID)});let _escapeKeyConsumers={};function addEscapeKeyEventHandler(consumerName,eventHandler){return _escapeKeyConsumers[consumerName]?(console.error("EscapeKeyEvent consumer of same name already registered: ",consumerName),!1):"function"!=typeof eventHandler?(console.error(`EscapeKeyEvent invalid eventHandler: ${consumerName}, ${eventHandler}`),!1):(_escapeKeyConsumers[consumerName]=eventHandler,!0)}function removeEscapeKeyEventHandler(consumerName){return _escapeKeyConsumers[consumerName]?(delete _escapeKeyConsumers[consumerName],!0):(console.error("EscapeKeyEvent no such consumer to remove: ",consumerName),!1)}function _showLastHiddenPanelIfPossible(){for(;lastHiddenBottomPanelStack.length>0;){let panelToShow=getPanelForID(lastHiddenBottomPanelStack.pop());if(panelToShow.canBeShown())return panelToShow.show(),!0}return!1}function _handleEscapeKey(){let allPanelsIDs=getAllPanelIDs();if(lastShownBottomPanelStack.length>0){let panelToHide;return getPanelForID(lastShownBottomPanelStack.pop()).hide(),!0}for(let panelID of allPanelsIDs){let panel=getPanelForID(panelID);if(panel.getPanelType()===PanelView.PANEL_TYPE_BOTTOM_PANEL&&panel.isVisible())return panel.hide(),lastHiddenBottomPanelStack.push(panelID),!0}return _showLastHiddenPanelIfPossible()}function _handleShiftEscapeKey(){return _showLastHiddenPanelIfPossible()}function _handleKeydown(event){if(event.keyCode!==KeyEvent.DOM_VK_ESCAPE||KeyBindingManager.isInOverlayMode())return;for(let consumerName of Object.keys(_escapeKeyConsumers))if(_escapeKeyConsumers[consumerName](event))return;let focussedEditor=EditorManager.getFocusedEditor();if(!focussedEditor||EditorManager.getFocusedInlineEditor())return;const dropdownOpen=$(".dropdown.open").is(":visible");dropdownOpen||focussedEditor.canConsumeEscapeKeyEvent()||(event.keyCode===KeyEvent.DOM_VK_ESCAPE&&event.shiftKey?_handleShiftEscapeKey():event.keyCode===KeyEvent.DOM_VK_ESCAPE&&_handleEscapeKey(),event.stopPropagation(),event.preventDefault())}window.document.body.addEventListener("keydown",_handleKeydown,!0),exports.createBottomPanel=createBottomPanel,exports.createPluginPanel=createPluginPanel,exports.isPanelVisible=isPanelVisible,exports.recomputeLayout=recomputeLayout,exports.getAllPanelIDs=getAllPanelIDs,exports.getPanelForID=getPanelForID,exports.addEscapeKeyEventHandler=addEscapeKeyEventHandler,exports.removeEscapeKeyEventHandler=removeEscapeKeyEventHandler,exports._setMockDOM=_setMockDOM,exports.EVENT_WORKSPACE_UPDATE_LAYOUT=EVENT_WORKSPACE_UPDATE_LAYOUT,exports.EVENT_WORKSPACE_PANEL_SHOWN=EVENT_WORKSPACE_PANEL_SHOWN,exports.EVENT_WORKSPACE_PANEL_HIDDEN=EVENT_WORKSPACE_PANEL_HIDDEN,exports.PANEL_TYPE_BOTTOM_PANEL=PanelView.PANEL_TYPE_BOTTOM_PANEL,exports.PANEL_TYPE_PLUGIN_PANEL=PluginPanelView.PANEL_TYPE_PLUGIN_PANEL});