@@ -48,6 +48,8 @@ public abstract class AbstractPrompt<T extends ConsoleUIItemIF> {
48
48
private Display display ;
49
49
private ListRange range = null ;
50
50
51
+ public static final long DEFAULT_TIMEOUT_WITH_ESC = 150L ;
52
+
51
53
public AbstractPrompt (
52
54
Terminal terminal , List <AttributedString > header , AttributedString message , ConsolePrompt .UiConfig cfg ) {
53
55
this (terminal , header , message , new ArrayList <>(), 0 , cfg );
@@ -312,7 +314,8 @@ private List<AttributedString> displayLines(int cursorRow, AttributedString buff
312
314
protected static class ExpandableChoicePrompt extends AbstractPrompt <ListItemIF > {
313
315
private enum Operation {
314
316
INSERT ,
315
- EXIT
317
+ EXIT ,
318
+ CANCEL
316
319
}
317
320
318
321
private final int startColumn ;
@@ -345,6 +348,8 @@ private void bindKeys(KeyMap<Operation> map) {
345
348
map .bind (Operation .INSERT , Character .toString (i ));
346
349
}
347
350
map .bind (Operation .EXIT , "\r " );
351
+ map .bind (Operation .CANCEL , KeyMap .esc ());
352
+ map .setAmbiguousTimeout (DEFAULT_TIMEOUT_WITH_ESC );
348
353
}
349
354
350
355
public ExpandableChoiceResult execute () {
@@ -396,6 +401,8 @@ public ExpandableChoiceResult execute() {
396
401
break ;
397
402
}
398
403
return new ExpandableChoiceResult (selectedId );
404
+ case CANCEL :
405
+ return null ;
399
406
}
400
407
}
401
408
}
@@ -408,7 +415,8 @@ protected static class ConfirmPrompt extends AbstractPrompt<ListItemIF> {
408
415
private enum Operation {
409
416
NO ,
410
417
YES ,
411
- EXIT
418
+ EXIT ,
419
+ CANCEL
412
420
}
413
421
414
422
private final int startColumn ;
@@ -442,6 +450,8 @@ private void bindKeys(KeyMap<Operation> map) {
442
450
map .bind (Operation .YES , yes , yes .toUpperCase ());
443
451
map .bind (Operation .NO , no , no .toUpperCase ());
444
452
map .bind (Operation .EXIT , "\r " );
453
+ map .bind (Operation .CANCEL , KeyMap .esc ());
454
+ map .setAmbiguousTimeout (DEFAULT_TIMEOUT_WITH_ESC );
445
455
}
446
456
447
457
public ConfirmResult execute () {
@@ -472,6 +482,8 @@ public ConfirmResult execute() {
472
482
break ;
473
483
}
474
484
return new ConfirmResult (confirm );
485
+ case CANCEL :
486
+ return null ;
475
487
}
476
488
}
477
489
}
@@ -487,13 +499,15 @@ private enum Operation {
487
499
BEGINNING_OF_LINE ,
488
500
END_OF_LINE ,
489
501
SELECT_CANDIDATE ,
490
- EXIT
502
+ EXIT ,
503
+ CANCEL
491
504
}
492
505
493
506
private enum SelectOp {
494
507
FORWARD_ONE_LINE ,
495
508
BACKWARD_ONE_LINE ,
496
- EXIT
509
+ EXIT ,
510
+ CANCEL
497
511
}
498
512
499
513
private final int startColumn ;
@@ -543,12 +557,16 @@ private void bindKeys(KeyMap<Operation> map) {
543
557
map .bind (Operation .RIGHT , ctrl ('F' ));
544
558
map .bind (Operation .LEFT , ctrl ('B' ));
545
559
map .bind (Operation .SELECT_CANDIDATE , "\t " );
560
+ map .bind (Operation .CANCEL , KeyMap .esc ());
561
+ map .setAmbiguousTimeout (DEFAULT_TIMEOUT_WITH_ESC );
546
562
}
547
563
548
564
private void bindSelectKeys (KeyMap <SelectOp > map ) {
549
565
map .bind (SelectOp .FORWARD_ONE_LINE , "\t " , "e" , ctrl ('E' ), key (terminal , InfoCmp .Capability .key_down ));
550
566
map .bind (SelectOp .BACKWARD_ONE_LINE , "y" , ctrl ('Y' ), key (terminal , InfoCmp .Capability .key_up ));
551
567
map .bind (SelectOp .EXIT , "\r " );
568
+ map .bind (SelectOp .CANCEL , KeyMap .esc ());
569
+ map .setAmbiguousTimeout (DEFAULT_TIMEOUT_WITH_ESC );
552
570
}
553
571
554
572
public InputResult execute () {
@@ -620,16 +638,20 @@ public InputResult execute() {
620
638
String selected =
621
639
selectCandidate (firstItemRow - 1 , buffer .toString (), row + 1 , startColumn , matches );
622
640
resetHeader ();
623
- buffer .delete (0 , buffer .length ());
624
- buffer .append (selected );
625
- column = startColumn + buffer .length ();
641
+ if (selected != null ) {
642
+ buffer .delete (0 , buffer .length ());
643
+ buffer .append (selected );
644
+ column = startColumn + buffer .length ();
645
+ }
626
646
}
627
647
break ;
628
648
case EXIT :
629
649
if (buffer .toString ().isEmpty ()) {
630
650
buffer .append (defaultValue );
631
651
}
632
652
return new InputResult (buffer .toString ());
653
+ case CANCEL :
654
+ return null ;
633
655
}
634
656
}
635
657
}
@@ -663,6 +685,8 @@ String selectCandidate(int buffRow, String buffer, int row, int column, List<Can
663
685
break ;
664
686
case EXIT :
665
687
return selected ;
688
+ case CANCEL :
689
+ return null ;
666
690
}
667
691
}
668
692
}
@@ -756,7 +780,8 @@ private enum Operation {
756
780
FORWARD_ONE_LINE ,
757
781
BACKWARD_ONE_LINE ,
758
782
INSERT ,
759
- EXIT
783
+ EXIT ,
784
+ CANCEL
760
785
}
761
786
762
787
private final List <T > items ;
@@ -789,6 +814,8 @@ private void bindKeys(KeyMap<Operation> map) {
789
814
map .bind (Operation .FORWARD_ONE_LINE , "e" , ctrl ('E' ), key (terminal , InfoCmp .Capability .key_down ));
790
815
map .bind (Operation .BACKWARD_ONE_LINE , "y" , ctrl ('Y' ), key (terminal , InfoCmp .Capability .key_up ));
791
816
map .bind (Operation .EXIT , "\r " );
817
+ map .bind (Operation .CANCEL , KeyMap .esc ());
818
+ map .setAmbiguousTimeout (DEFAULT_TIMEOUT_WITH_ESC );
792
819
}
793
820
794
821
public ListResult execute () {
@@ -823,6 +850,8 @@ public ListResult execute() {
823
850
case EXIT :
824
851
T listItem = items .get (selectRow - firstItemRow );
825
852
return new ListResult (listItem .getName ());
853
+ case CANCEL :
854
+ return null ;
826
855
}
827
856
}
828
857
}
@@ -833,7 +862,8 @@ private enum Operation {
833
862
FORWARD_ONE_LINE ,
834
863
BACKWARD_ONE_LINE ,
835
864
TOGGLE ,
836
- EXIT
865
+ EXIT ,
866
+ CANCEL
837
867
}
838
868
839
869
private final List <CheckboxItemIF > items ;
@@ -864,6 +894,8 @@ private void bindKeys(KeyMap<Operation> map) {
864
894
map .bind (Operation .BACKWARD_ONE_LINE , "y" , ctrl ('Y' ), key (terminal , InfoCmp .Capability .key_up ));
865
895
map .bind (Operation .TOGGLE , " " );
866
896
map .bind (Operation .EXIT , "\r " );
897
+ map .bind (Operation .CANCEL , KeyMap .esc ());
898
+ map .setAmbiguousTimeout (DEFAULT_TIMEOUT_WITH_ESC );
867
899
}
868
900
869
901
public CheckboxResult execute () {
@@ -895,6 +927,8 @@ public CheckboxResult execute() {
895
927
break ;
896
928
case EXIT :
897
929
return new CheckboxResult (selected );
930
+ case CANCEL :
931
+ return null ;
898
932
}
899
933
}
900
934
}
0 commit comments