forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathWorkspaceManager.js
More file actions
1 lines (1 loc) · 13 KB
/
WorkspaceManager.js
File metadata and controls
1 lines (1 loc) · 13 KB
1
define(function(require,exports,module){const AppInit=require("utils/AppInit"),EventDispatcher=require("utils/EventDispatcher"),KeyBindingManager=require("command/KeyBindingManager"),Resizer=require("utils/Resizer"),AnimationUtils=require("utils/AnimationUtils"),Strings=require("strings"),PluginPanelView=require("view/PluginPanelView"),PanelView=require("view/PanelView"),EditorManager=require("editor/EditorManager"),MainViewManager=require("view/MainViewManager"),KeyEvent=require("utils/KeyEvent"),DEFAULT_PANEL_ID="workspace.defaultPanel",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 lastShownBottomPanelStack=[],$bottomPanelContainer,$statusBarPanelToggle,_statusBarToggleInProgress=!1;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())});var sidebarWidth=$("#sidebar").outerWidth()||0;$mainToolbar.data("maxsize",Math.min(.75*window.innerWidth,window.innerWidth-sidebarWidth-100))}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(){if($windowContent&&$editorHolder){if(currentlyShownPanel&&$mainToolbar.is(":visible")&&_clampPluginPanelWidth(currentlyShownPanel),triggerUpdateLayout(),PanelView.isMaximized()&&$bottomPanelContainer&&$bottomPanelContainer.is(":visible")){let maxHeight=$editorHolder.height()+$bottomPanelContainer.height();$bottomPanelContainer.height(maxHeight),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,title){$bottomPanelContainer.append($panel),$panel.hide(),updateResizeLimits();let bottomPanel=new PanelView.Panel($panel,id,title);return panelIDMap[id]=bottomPanel,bottomPanel}function destroyBottomPanel(id){let panel=panelIDMap[id];panel&&("function"==typeof panel.destroy&&panel.destroy(),delete panelIDMap[id])}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"),$bottomPanelContainer=$('<div id="bottom-panel-container" class="vert-resizable top-resizer"></div>');let $bottomPanelTabBar=$('<div id="bottom-panel-tab-bar"></div>'),$bottomPanelTabsOverflow=$('<div class="bottom-panel-tabs-overflow"></div>'),$tabBarActions=$('<div class="bottom-panel-tab-bar-actions"></div>');$tabBarActions.append($('<span class="bottom-panel-hide-btn"><i class="fa-solid fa-minus"></i></span>').attr("title",Strings.BOTTOM_PANEL_MINIMIZE)),$tabBarActions.append($('<span class="bottom-panel-maximize-btn"><i class="fa-regular fa-square"></i></span>').attr("title",Strings.BOTTOM_PANEL_MAXIMIZE)),$bottomPanelTabBar.append($bottomPanelTabsOverflow),$bottomPanelTabBar.append($tabBarActions),$bottomPanelContainer.append($bottomPanelTabBar),$bottomPanelContainer.insertBefore("#status-bar"),$bottomPanelContainer.hide(),PanelView.init($bottomPanelContainer,$bottomPanelTabBar,$bottomPanelTabsOverflow,$editorHolder,recomputeLayout,DEFAULT_PANEL_ID),$statusBarPanelToggle=$('<div id="status-panel-toggle" class="indicator global-indicator"><i class="fa-solid fa-chevron-up"></i></div>').attr("title",Strings.BOTTOM_PANEL_SHOW),$("#status-indicators").prepend($statusBarPanelToggle),$statusBarPanelToggle.on("click",function(){_statusBarToggleInProgress=!0,_togglePanels(),_statusBarToggleInProgress=!1}),Resizer.makeResizable($bottomPanelContainer[0],Resizer.DIRECTION_VERTICAL,Resizer.POSITION_TOP,200,!1,void 0,!0),listenToResize($bottomPanelContainer),$bottomPanelContainer.on("panelResizeUpdate panelResizeEnd",function(){let editorHeight=$editorHolder.height();PanelView.isMaximized()&&editorHeight>PanelView.MAXIMIZE_THRESHOLD?PanelView.exitMaximizeOnResize():!PanelView.isMaximized()&&editorHeight<=PanelView.MAXIMIZE_THRESHOLD&&PanelView.enterMaximizeOnResize()}),$bottomPanelContainer.on("panelCollapsed",function(){$statusBarPanelToggle.find("i").removeClass("fa-chevron-down").addClass("fa-chevron-up"),$statusBarPanelToggle.attr("title",Strings.BOTTOM_PANEL_SHOW),_statusBarToggleInProgress||AnimationUtils.animateUsingClass($statusBarPanelToggle[0],"flash",800);let openIds=PanelView.getOpenBottomPanelIDs();for(let i=0;i<openIds.length;i++)lastShownBottomPanelStack=lastShownBottomPanelStack.filter(item=>item!==openIds[i])}),$bottomPanelContainer.on("panelExpanded",function(){$statusBarPanelToggle.find("i").removeClass("fa-chevron-up").addClass("fa-chevron-down"),$statusBarPanelToggle.attr("title",Strings.BOTTOM_PANEL_HIDE_TOGGLE),_statusBarToggleInProgress||AnimationUtils.animateUsingClass($statusBarPanelToggle[0],"flash",800);let openIds=PanelView.getOpenBottomPanelIDs();for(let i=0;i<openIds.length;i++)(lastShownBottomPanelStack=lastShownBottomPanelStack.filter(item=>item!==openIds[i])).push(openIds[i])}),listenToResize($("#sidebar")),listenToResize($("#main-toolbar"))}),window.addEventListener("resize",handleWindowResize,!0),EventDispatcher.makeEventDispatcher(exports),PanelView.on(PanelView.EVENT_PANEL_SHOWN,(event,panelID)=>{(lastShownBottomPanelStack=lastShownBottomPanelStack.filter(item=>item!==panelID)).push(panelID),exports.trigger(EVENT_WORKSPACE_PANEL_SHOWN,panelID),triggerUpdateLayout()}),PanelView.on(PanelView.EVENT_PANEL_HIDDEN,(event,panelID)=>{lastShownBottomPanelStack=lastShownBottomPanelStack.filter(item=>item!==panelID),exports.trigger(EVENT_WORKSPACE_PANEL_HIDDEN,panelID),triggerUpdateLayout()});let currentlyShownPanel=null,panelShowInProgress=!1,initialSizeSetOnce={};function _getInitialSize(panel){let setOnce;if(!initialSizeSetOnce[panel.panelID])return initialSizeSetOnce[panel.panelID]=!0,panel.initialSize}function _clampPluginPanelWidth(panelBeingShown){let sidebarWidth=$("#sidebar").outerWidth()||0,pluginIconsBarWidth=$pluginIconsBar.outerWidth(),minToolbarWidth=(panelBeingShown.minWidth||0)+pluginIconsBarWidth,maxToolbarWidth=Math.max(minToolbarWidth,Math.min(.75*window.innerWidth,window.innerWidth-sidebarWidth-100)),currentWidth=$mainToolbar.width();if(currentWidth>maxToolbarWidth||currentWidth<minToolbarWidth){let clampedWidth=Math.max(minToolbarWidth,Math.min(currentWidth,maxToolbarWidth));$mainToolbar.width(clampedWidth),$windowContent.css("right",clampedWidth),Resizer.resyncSizer($mainToolbar[0])}}function _showPluginSidePanel(panelID){let panelBeingShown=getPanelForID(panelID),pluginIconsBarWidth=$pluginIconsBar.outerWidth(),minToolbarWidth=(panelBeingShown.minWidth||0)+pluginIconsBarWidth;Resizer.makeResizable($mainToolbar,Resizer.DIRECTION_HORIZONTAL,Resizer.POSITION_LEFT,minToolbarWidth,!1,void 0,!0,void 0,$windowContent,void 0,_getInitialSize(panelBeingShown)),Resizer.show($mainToolbar[0]),_clampPluginPanelWidth(panelBeingShown),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())}function setPluginPanelWidth(width){if(currentlyShownPanel){var pluginIconsBarWidth=$pluginIconsBar.outerWidth(),newToolbarWidth=width+pluginIconsBarWidth,minSize,minToolbarWidth=(currentlyShownPanel.minWidth||0)+pluginIconsBarWidth,sidebarWidth=$("#sidebar").outerWidth()||0,maxToolbarWidth=Math.min(.75*window.innerWidth,window.innerWidth-sidebarWidth-100);newToolbarWidth=Math.max(newToolbarWidth,minToolbarWidth),newToolbarWidth=Math.min(newToolbarWidth,maxToolbarWidth),$mainToolbar.width(newToolbarWidth),$windowContent.css("right",newToolbarWidth),Resizer.resyncSizer($mainToolbar[0]),recomputeLayout(!0)}}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 _showDefaultPanel(){let defaultPanel=panelIDMap[DEFAULT_PANEL_ID];defaultPanel&&defaultPanel.show()}function _togglePanels(){return!!$bottomPanelContainer&&($bottomPanelContainer.is(":visible")?Resizer.hide($bottomPanelContainer[0]):PanelView.getOpenBottomPanelIDs().length>0?Resizer.show($bottomPanelContainer[0]):_showDefaultPanel(),triggerUpdateLayout(),!0)}function _handleEscapeKey(){return _togglePanels()}function _handleShiftEscape(event){if(!event.shiftKey)return!1;if(EditorManager.getFocusedEditor()){let activePanel=PanelView.getActiveBottomPanel();activePanel&&activePanel.isVisible()||(_togglePanels(),activePanel=PanelView.getActiveBottomPanel()),activePanel.focus()}else MainViewManager.focusActivePane();return event.stopPropagation(),event.preventDefault(),!0}function _handleKeydown(event){if(event.keyCode!==KeyEvent.DOM_VK_ESCAPE||KeyBindingManager.isInOverlayMode())return;if(_handleShiftEscape(event))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()||(_handleEscapeKey(),event.stopPropagation(),event.preventDefault())}window.document.body.addEventListener("keydown",_handleKeydown,!0),exports.createBottomPanel=createBottomPanel,exports.destroyBottomPanel=destroyBottomPanel,exports.createPluginPanel=createPluginPanel,exports.isPanelVisible=isPanelVisible,exports.setPluginPanelWidth=setPluginPanelWidth,exports.recomputeLayout=recomputeLayout,exports.getAllPanelIDs=getAllPanelIDs,exports.getPanelForID=getPanelForID,exports.getOpenBottomPanelIDs=PanelView.getOpenBottomPanelIDs,exports.hideAllOpenBottomPanels=PanelView.hideAllOpenPanels,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.DEFAULT_PANEL_ID=DEFAULT_PANEL_ID,exports.PANEL_TYPE_BOTTOM_PANEL=PanelView.PANEL_TYPE_BOTTOM_PANEL,exports.PANEL_TYPE_PLUGIN_PANEL=PluginPanelView.PANEL_TYPE_PLUGIN_PANEL});