View Javadoc
1   package com.jsql.view.swing.action;
2   
3   import com.jsql.view.swing.util.MediatorHelper;
4   
5   import javax.swing.*;
6   import java.awt.*;
7   import java.awt.event.InputEvent;
8   import java.awt.event.KeyEvent;
9   
10  public class AltKeyEventDispatcher implements KeyEventDispatcher {
11  
12      private boolean wasAltDPressed = false;
13      private boolean wasAltPressed = false;
14      private boolean wasAltGraphPressed = false;
15      
16      @Override
17      public boolean dispatchKeyEvent(KeyEvent keyEvent) {
18          var shouldNotTakeFurtherAction = false;
19          
20          // Alt key press/release generates 2 events
21          // AltGr key press/release generates 4 events including an Alt press/release
22          // => AltGr:press Alt:press AltGr:release Alt:release
23          // AltGr keycode is the same as Ctrl
24          if (keyEvent.getKeyCode() == KeyEvent.VK_CONTROL) {
25              this.wasAltGraphPressed = true;
26          }
27          
28          boolean isAltDPressed = keyEvent.isAltDown()
29              && keyEvent.getKeyCode() == (KeyEvent.VK_ALT & KeyEvent.VK_D);
30          
31          boolean isAltReleased = keyEvent.getKeyCode() == KeyEvent.VK_ALT
32              && keyEvent.getModifiersEx() == (InputEvent.ALT_DOWN_MASK & KeyEvent.KEY_RELEASED);
33          
34          boolean isAltPressed = keyEvent.isAltDown()
35              && keyEvent.getKeyCode() == KeyEvent.VK_ALT
36              && !this.wasAltGraphPressed;
37          
38          boolean wasAltPressedAlready = !this.wasAltDPressed
39              && !this.wasAltPressed
40              && !this.wasAltGraphPressed;
41          
42          if (isAltDPressed) {
43              this.selectAddressBar();
44              shouldNotTakeFurtherAction = true;
45          } else if (isAltReleased) {
46              this.showMenuBar(wasAltPressedAlready);
47              shouldNotTakeFurtherAction = true;
48          } else if (isAltPressed) {
49              this.hideMenuBar();
50              shouldNotTakeFurtherAction = true;
51          }
52          
53          return shouldNotTakeFurtherAction;
54      }
55  
56      private void selectAddressBar() {
57          MediatorHelper.panelAddressBar().getTextFieldAddress().requestFocusInWindow();
58          MediatorHelper.panelAddressBar().getTextFieldAddress().selectAll();
59          this.wasAltDPressed = true;
60      }
61  
62      private void showMenuBar(boolean wasAltPressedAlready) {  // Avoid flickering and AltGr pollution
63          if (wasAltPressedAlready) {
64              if (MenuSelectionManager.defaultManager().getSelectedPath().length > 0) {
65                  MenuSelectionManager.defaultManager().clearSelectedPath();
66              } else if (MediatorHelper.panelAddressBar().isAdvanceActivated()) {
67                  MediatorHelper.menubar().setVisible(!MediatorHelper.menubar().isVisible());
68                  this.wasAltGraphPressed = false;
69              }
70          } else {
71              this.wasAltDPressed = false;
72              this.wasAltPressed = false;
73              this.wasAltGraphPressed = false;
74          }
75      }
76  
77      private void hideMenuBar() {  // Avoid flickering and AltGr pollution
78          if (
79              MediatorHelper.panelAddressBar().isAdvanceActivated()
80              && MediatorHelper.menubar().isVisible()
81          ) {
82              MenuSelectionManager.defaultManager().clearSelectedPath();
83              MediatorHelper.menubar().setVisible(false);
84              this.wasAltPressed = true;
85              this.wasAltGraphPressed = false;
86          }
87      }
88  }