@@ -4,19 +4,23 @@ import type { Target } from "../typings/target.types";
44import { ensureSingleEditor } from "../util/targetUtils" ;
55import type { SimpleAction , ActionReturnValue } from "./actions.types" ;
66
7- export class SetSelection implements SimpleAction {
8- constructor ( ) {
7+ abstract class SetSelectionBase implements SimpleAction {
8+ constructor (
9+ private selectionMode : "set" | "add" ,
10+ private rangeMode : "content" | "before" | "after" ,
11+ ) {
912 this . run = this . run . bind ( this ) ;
1013 }
1114
12- protected getSelection ( target : Target ) {
13- return target . contentSelection ;
14- }
15-
1615 async run ( targets : Target [ ] ) : Promise < ActionReturnValue > {
1716 const editor = ensureSingleEditor ( targets ) ;
17+ const targetSelections = this . getSelections ( targets ) ;
18+
19+ const selections =
20+ this . selectionMode === "add"
21+ ? editor . selections . concat ( targetSelections )
22+ : targetSelections ;
1823
19- const selections = targets . map ( this . getSelection ) ;
2024 await ide ( )
2125 . getEditableTextEditor ( editor )
2226 . setSelections ( selections , { focusEditor : true } ) ;
@@ -25,16 +29,57 @@ export class SetSelection implements SimpleAction {
2529 thatTargets : targets ,
2630 } ;
2731 }
32+
33+ private getSelections ( targets : Target [ ] ) : Selection [ ] {
34+ switch ( this . rangeMode ) {
35+ case "content" :
36+ return targets . map ( ( target ) => target . contentSelection ) ;
37+ case "before" :
38+ return targets . map (
39+ ( target ) =>
40+ new Selection ( target . contentRange . start , target . contentRange . start ) ,
41+ ) ;
42+ case "after" :
43+ return targets . map (
44+ ( target ) =>
45+ new Selection ( target . contentRange . end , target . contentRange . end ) ,
46+ ) ;
47+ }
48+ }
49+ }
50+
51+ export class SetSelection extends SetSelectionBase {
52+ constructor ( ) {
53+ super ( "set" , "content" ) ;
54+ }
55+ }
56+
57+ export class SetSelectionBefore extends SetSelectionBase {
58+ constructor ( ) {
59+ super ( "set" , "before" ) ;
60+ }
61+ }
62+
63+ export class SetSelectionAfter extends SetSelectionBase {
64+ constructor ( ) {
65+ super ( "set" , "after" ) ;
66+ }
2867}
2968
30- export class SetSelectionBefore extends SetSelection {
31- protected getSelection ( target : Target ) {
32- return new Selection ( target . contentRange . start , target . contentRange . start ) ;
69+ export class AddSelection extends SetSelectionBase {
70+ constructor ( ) {
71+ super ( "add" , "content" ) ;
72+ }
73+ }
74+
75+ export class AddSelectionBefore extends SetSelectionBase {
76+ constructor ( ) {
77+ super ( "add" , "before" ) ;
3378 }
3479}
3580
36- export class SetSelectionAfter extends SetSelection {
37- protected getSelection ( target : Target ) {
38- return new Selection ( target . contentRange . end , target . contentRange . end ) ;
81+ export class AddSelectionAfter extends SetSelectionBase {
82+ constructor ( ) {
83+ super ( "add" , "after" ) ;
3984 }
4085}
0 commit comments