77 TextEditorElement ,
88 CommandEvent ,
99 CursorPositionChangedEvent ,
10+ TextEditorComponent ,
1011} from "atom"
1112import type { Datatip , DatatipProvider } from "atom-ide-base"
1213import { ViewContainer } from "atom-ide-base/commons-ui/float-pane/ViewContainer"
@@ -474,6 +475,10 @@ export class DataTipManager {
474475 const overlayMarker = editor . markBufferRange ( new Range ( position , position ) , {
475476 invalidate : "never" ,
476477 } )
478+
479+ // makes the text selectable with the help of user-select: text
480+ element . setAttribute ( "tabindex" , "-1" )
481+
477482 editor . decorateMarker ( overlayMarker , {
478483 type : "overlay" ,
479484 class : "datatip-overlay" ,
@@ -482,12 +487,27 @@ export class DataTipManager {
482487 } )
483488 disposables . add ( new Disposable ( ( ) => overlayMarker . destroy ( ) ) )
484489
490+ const editorComponent = atom . views . getView ( editor ) . getComponent ( )
491+
485492 element . addEventListener ( "mouseenter" , ( ) => {
486493 this . editorView ?. removeEventListener ( "mousemove" , this . onMouseMoveEvt )
494+ element . addEventListener ( "keydown" , copyListener )
487495 } )
488496
489497 element . addEventListener ( "mouseleave" , ( ) => {
490498 this . editorView ?. addEventListener ( "mousemove" , this . onMouseMoveEvt )
499+ element . removeEventListener ( "keydown" , copyListener )
500+ } )
501+
502+ /**
503+ - focus on the datatip once the text is selected (cursor gets disabled temporarily)
504+ - remove focus once mouse leaves
505+ */
506+ element . addEventListener ( "mousedown" , ( ) => {
507+ blurEditor ( editorComponent )
508+ element . addEventListener ( "mouseleave" , ( ) => {
509+ focusEditor ( editorComponent )
510+ } )
491511 } )
492512
493513 // TODO move this code to atom-ide-base
@@ -512,3 +532,25 @@ export class DataTipManager {
512532 this . dataTipMarkerDisposables = null
513533 }
514534}
535+
536+ // TODO we should not need this
537+ /** A manual copy listener */
538+ async function copyListener ( event : KeyboardEvent ) {
539+ event . preventDefault ( )
540+ if ( event . ctrlKey && event . key === "c" ) {
541+ const text = document . getSelection ( ) ?. toString ( ) ?? ""
542+ await navigator . clipboard . writeText ( text )
543+ }
544+ }
545+
546+ function focusEditor ( editorComponent : TextEditorComponent ) {
547+ // @ts -ignore
548+ editorComponent ?. didFocus ( )
549+ }
550+
551+ function blurEditor ( editorComponent : TextEditorComponent ) {
552+ // @ts -ignore
553+ editorComponent ?. didBlurHiddenInput ( {
554+ relatedTarget : null ,
555+ } )
556+ }
0 commit comments