7
7
TextEditorElement ,
8
8
CommandEvent ,
9
9
CursorPositionChangedEvent ,
10
+ TextEditorComponent ,
10
11
} from "atom"
11
12
import type { Datatip , DatatipProvider } from "atom-ide-base"
12
13
import { ViewContainer } from "atom-ide-base/commons-ui/float-pane/ViewContainer"
@@ -474,6 +475,10 @@ export class DataTipManager {
474
475
const overlayMarker = editor . markBufferRange ( new Range ( position , position ) , {
475
476
invalidate : "never" ,
476
477
} )
478
+
479
+ // makes the text selectable with the help of user-select: text
480
+ element . setAttribute ( "tabindex" , "-1" )
481
+
477
482
editor . decorateMarker ( overlayMarker , {
478
483
type : "overlay" ,
479
484
class : "datatip-overlay" ,
@@ -482,12 +487,27 @@ export class DataTipManager {
482
487
} )
483
488
disposables . add ( new Disposable ( ( ) => overlayMarker . destroy ( ) ) )
484
489
490
+ const editorComponent = atom . views . getView ( editor ) . getComponent ( )
491
+
485
492
element . addEventListener ( "mouseenter" , ( ) => {
486
493
this . editorView ?. removeEventListener ( "mousemove" , this . onMouseMoveEvt )
494
+ element . addEventListener ( "keydown" , copyListener )
487
495
} )
488
496
489
497
element . addEventListener ( "mouseleave" , ( ) => {
490
498
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
+ } )
491
511
} )
492
512
493
513
// TODO move this code to atom-ide-base
@@ -512,3 +532,25 @@ export class DataTipManager {
512
532
this . dataTipMarkerDisposables = null
513
533
}
514
534
}
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