View Javadoc
1   package com.jsql.view.swing.text.action;
2   
3   import javax.swing.*;
4   import javax.swing.text.DefaultEditorKit;
5   import javax.swing.text.JTextComponent;
6   import javax.swing.text.TextAction;
7   import java.awt.event.ActionEvent;
8   import java.util.Objects;
9   
10  /**
11   * Action to cancel Beep sound when deleting last character.
12   * Used on TextField.
13   */
14  public class SilentDeleteTextAction extends TextAction {
15      
16      private final transient Action deleteAction;
17      
18      public SilentDeleteTextAction(String name, Action deleteAction) {
19          super(name);
20          this.deleteAction = deleteAction;
21      }
22      
23      @Override
24      public void actionPerformed(ActionEvent e) {
25          JTextComponent target = this.getTextComponent(e);
26          if (Objects.nonNull(target) && target.isEditable()) {
27              var caret = target.getCaret();
28              int dot = caret.getDot();
29              int mark = caret.getMark();
30              
31              if (DefaultEditorKit.deletePrevCharAction.equals(this.getValue(Action.NAME))) {
32                  // @see javax/swing/text/DefaultEditorKit.java DeletePrevCharAction
33                  if (dot == 0 && mark == 0) {
34                      return;
35                  }
36              } else {
37                  // @see javax/swing/text/DefaultEditorKit.java DeleteNextCharAction
38                  var doc = target.getDocument();
39                  if (dot == mark && doc.getLength() == dot) {
40                      return;
41                  }
42              }
43          }
44          
45          this.deleteAction.actionPerformed(e);
46      }
47  }