forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSelectionViewManager.js
More file actions
1 lines (1 loc) · 8.04 KB
/
SelectionViewManager.js
File metadata and controls
1 lines (1 loc) · 8.04 KB
1
define(function(require,exports,module){const CommandManager=require("command/CommandManager"),Commands=require("command/Commands"),EditorManager=require("editor/EditorManager"),Menus=require("command/Menus"),PreferencesManager=require("preferences/PreferencesManager"),Strings=require("strings"),ViewUtils=require("utils/ViewUtils"),AppInit=require("utils/AppInit"),WorkspaceManager=require("view/WorkspaceManager"),EventDispatcher=require("utils/EventDispatcher"),ProviderRegistrationHandler=require("features/PriorityBasedRegistration").RegistrationHandler,previewContainerHTML='<div id="selection-view-container">\n <div class="preview-content">\n </div>\n</div>';EventDispatcher.makeEventDispatcher(exports);const _EVENT_POPUP_CONTENT_MUTATED="_popupContentMutated",observer=new MutationObserver(mutations=>{for(let mutation of mutations)if("childList"===mutation.type||"subtree"===mutation.type){exports.trigger(_EVENT_POPUP_CONTENT_MUTATED,mutations);break}}),_providerRegistrationHandler=new ProviderRegistrationHandler,registerSelectionViewProvider=_providerRegistrationHandler.registerProvider.bind(_providerRegistrationHandler),removeSelectionViewProvider=_providerRegistrationHandler.removeProvider.bind(_providerRegistrationHandler);function _getSelectionViewProviders(editor){let SelectionViewProviders=[],language=editor.getLanguageForSelection(),enabledProviders=_providerRegistrationHandler.getProvidersForLanguageId(language.getId());for(let item of enabledProviders)SelectionViewProviders.push(item.provider);return SelectionViewProviders}let enabled,prefs=null,$previewContainer,lastMouseX=0,lastMouseY=0,$previewContent;const CMD_ENABLE_SELECTION_VIEW="view.enableSelectionView",POPUP_DELAY=200,POINTER_HEIGHT=10,POPOVER_HORZ_MARGIN=5;(prefs=PreferencesManager.getExtensionPrefs("SelectionView")).definePreference("enabled","boolean",!0,{description:Strings.DESCRIPTION_SELECTION_VIEW_ENABLED});let popoverState=null;function hidePreview(){popoverState&&(popoverState.visible&&($previewContent.empty(),$previewContainer.hide(),$previewContainer.removeClass("active"),EditorManager.getActiveEditor()&&EditorManager.getActiveEditor().focus()),popoverState=null)}function positionPreview(editor){let ybot=popoverState.ybot;if($previewContent.find("#selection-view-popover-root").is(":empty"))return void hidePreview();let previewWidth=$previewContainer.outerWidth(),top=lastMouseY-$previewContainer.outerHeight()-POINTER_HEIGHT,left=lastMouseX-previewWidth/2,elementRect={top:top,left:left-POPOVER_HORZ_MARGIN,height:$previewContainer.outerHeight()+POINTER_HEIGHT,width:previewWidth+2*POPOVER_HORZ_MARGIN},clip=ViewUtils.getElementClipSize($(editor.getRootElement()),elementRect);clip.left>0?left+=clip.left:clip.right>0&&(left-=clip.right),clip.top>0?(top=ybot+POINTER_HEIGHT,$previewContainer.removeClass("preview-bubble-above").addClass("preview-bubble-below")):$previewContainer.removeClass("preview-bubble-below").addClass("preview-bubble-above"),$previewContainer.css({left:left,top:top}).addClass("active")}function _createPopoverState(editor,popoverResults){if(popoverResults&&popoverResults.length){let popover={content:$("<div id='selection-view-popover-root'></div>")};for(let result of popoverResults)popover.content.append(result.content);let pos=editor.getCursorPos(),startCoord=editor.charCoords(pos),endCoord=editor.charCoords(pos);return popover.xpos=(endCoord.left-startCoord.left)/2+startCoord.left,endCoord.left<startCoord.left&&(popover.xpos=startCoord.left),popover.ytop=startCoord.top,popover.ybot=startCoord.bottom,popover.visible=!1,popover.editor=editor,popover.pos=pos,popover}return null}async function queryPreviewProviders(editor,selectionObj){if(!editor)return null;if(1!==(selectionObj=selectionObj||editor.getSelections()).length)return null;let selection=editor.getSelection();if(selection.start.line===selection.end.line&&selection.start.ch===selection.end.ch)return null;let providers=_getSelectionViewProviders(editor),popovers=[],providerPromises=[];for(let provider of providers)provider.getSelectionView?providerPromises.push(provider.getSelectionView(editor,selectionObj)):console.error("Error: SelectionView provider should implement getSelectionView function",provider);let results=await Promise.allSettled(providerPromises);for(let result of results)"fulfilled"===result.status&&result.value&&popovers.push(result.value);return _createPopoverState(editor,popovers)}function _renderPreview(editor){if(popoverState){let $popoverContent=$(popoverState.content);$previewContent.empty(),$previewContent.append($popoverContent),$previewContainer.show(),popoverState.visible=!0,positionPreview(editor),exports.on(_EVENT_POPUP_CONTENT_MUTATED,()=>{popoverState&&editor&&positionPreview(editor)})}}let currentQueryID=0;async function showPreview(editor,selectionObj){if(!editor)return void hidePreview();let savedQueryId=++currentQueryID;popoverState=await queryPreviewProviders(editor,selectionObj),savedQueryId===currentQueryID&&_renderPreview(editor)}function handleMouseUp(event){enabled&&(hidePreview(),0===event.buttons&&setTimeout(()=>{let editor=EditorManager.getActiveEditor();editor&&showPreview(editor,editor.getSelections())},POPUP_DELAY))}function _processMouseMove(event){if(lastMouseX=event.clientX,lastMouseY=event.clientY,0!==event.buttons)return;if(isSelectionViewShown())return;let editor=EditorManager.getHoveredEditor(event);if(editor){let mousePos=editor.coordsChar({left:event.clientX,top:event.clientY}),selectionObj=editor.getSelections();if(1!==selectionObj.length)return;let selection=editor.getSelection();if(selection.start.line===selection.end.line&&selection.start.ch===selection.end.ch)return;editor.posWithinRange(mousePos,selection.start,selection.end,!0)&&(popoverState={},showPreview(editor,selectionObj))}}function onActiveEditorChange(_event,current,previous){hidePreview(),previous&&previous.document&&previous.document.off("change",hidePreview),current&¤t.document&¤t.document.on("change",hidePreview)}function updateMenuItemCheckmark(){CommandManager.get(CMD_ENABLE_SELECTION_VIEW).setChecked(enabled)}function setEnabled(_enabled,doNotSave){if(enabled!==_enabled){enabled=_enabled;let editorHolder=$("#editor-holder")[0];enabled?(editorHolder.addEventListener("mouseup",handleMouseUp,!0),editorHolder.addEventListener("mousemove",_processMouseMove,!0),editorHolder.addEventListener("scroll",hidePreview,!0),onActiveEditorChange(null,EditorManager.getActiveEditor(),null),EditorManager.on("activeEditorChange",onActiveEditorChange)):(editorHolder.removeEventListener("mouseup",handleMouseUp,!0),editorHolder.addEventListener("mousemove",_processMouseMove,!0),editorHolder.removeEventListener("scroll",hidePreview,!0),onActiveEditorChange(null,null,EditorManager.getActiveEditor()),EditorManager.off("activeEditorChange",onActiveEditorChange),hidePreview()),doNotSave||(prefs.set("enabled",enabled),prefs.save())}updateMenuItemCheckmark()}function toggleEnableSelectionView(){setEnabled(!enabled)}function _forceShow(popover){hidePreview(),popoverState=popover,_renderPreview(popover.editor)}function _handleEscapeKeyEvent(event){return!!isSelectionViewShown()&&(hidePreview(),event.preventDefault(),event.stopPropagation(),!0)}function isSelectionViewShown(){return popoverState&&popoverState.visible||!1}AppInit.appReady(function(){$previewContainer=$(previewContainerHTML).appendTo($("body")),$previewContent=$previewContainer.find(".preview-content"),observer.observe($previewContent[0],{childList:!0,subtree:!0}),CommandManager.register(Strings.CMD_ENABLE_SELECTION_VIEW,CMD_ENABLE_SELECTION_VIEW,toggleEnableSelectionView),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).addMenuItem(CMD_ENABLE_SELECTION_VIEW,null,Menus.AFTER,Commands.VIEW_TOGGLE_INSPECTION),setEnabled(prefs.get("enabled"),!0),prefs.on("change","enabled",function(){setEnabled(prefs.get("enabled"),!0)}),WorkspaceManager.addEscapeKeyEventHandler("selectionView",_handleEscapeKeyEvent)}),exports._queryPreviewProviders=queryPreviewProviders,exports._forceShow=_forceShow,exports.registerSelectionViewProvider=registerSelectionViewProvider,exports.removeSelectionViewProvider=removeSelectionViewProvider,exports.isSelectionViewShown=isSelectionViewShown});