View Javadoc
1   package com.jsql.view.swing.panel.consoles;
2   
3   import com.jsql.view.subscriber.Seal;
4   import com.jsql.util.I18nUtil;
5   import com.jsql.view.swing.popupmenu.JPopupMenuTable;
6   import com.jsql.view.swing.util.MediatorHelper;
7   
8   import javax.swing.*;
9   import javax.swing.table.DefaultTableCellRenderer;
10  import javax.swing.table.DefaultTableModel;
11  import java.awt.*;
12  import java.awt.event.InputEvent;
13  import java.awt.event.KeyEvent;
14  import java.awt.event.MouseAdapter;
15  import java.awt.event.MouseEvent;
16  import java.util.ArrayList;
17  import java.util.HashSet;
18  import java.util.List;
19  import java.util.Set;
20  
21  public class NetworkTable extends JTable {
22  
23      public static final String NETWORK_TABLE = "networkTable";
24  
25      /**
26       * List of HTTP injection requests and responses.
27       */
28      private final transient List<Seal.MessageHeader> listHttpHeader = new ArrayList<>();
29  
30      public NetworkTable(TabbedPaneNetworkTab tabbedPaneNetworkTab) {
31          super(0, 4);
32          
33          this.setName(NetworkTable.NETWORK_TABLE);
34          this.setComponentPopupMenu(new JPopupMenuTable(this));
35          this.setRowSelectionAllowed(true);
36          this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
37          this.setRowHeight(20);
38          this.getTableHeader().setReorderingAllowed(false);
39          
40          this.addMouseListener(new MouseAdapter() {
41              @Override
42              public void mousePressed(MouseEvent e) {
43                  NetworkTable.this.requestFocusInWindow();
44                  
45                  // move selected row and place cursor on focused cell
46                  if (SwingUtilities.isRightMouseButton(e)) {
47                      var point = e.getPoint();
48  
49                      // get the row index that contains that coordinate
50                      var rowNumber = NetworkTable.this.rowAtPoint(point);
51                      var colNumber = NetworkTable.this.columnAtPoint(point);
52                      
53                      // Get the ListSelectionModel of the JTable
54                      DefaultListSelectionModel modelRow = (DefaultListSelectionModel) NetworkTable.this.getSelectionModel();
55                      DefaultListSelectionModel modelColumn = (DefaultListSelectionModel) NetworkTable.this.getColumnModel().getSelectionModel();
56  
57                      NetworkTable.this.setRowSelectionInterval(rowNumber, rowNumber);
58                      modelRow.moveLeadSelectionIndex(rowNumber);
59                      modelColumn.moveLeadSelectionIndex(colNumber);
60                  }
61              }
62          });
63  
64          this.setModel(new DefaultTableModel() {
65              private final String[] columns = {
66                  I18nUtil.valueByKey("NETWORK_TAB_URL_COLUMN"),
67                  String.format("%s (KB)", I18nUtil.valueByKey("NETWORK_TAB_SIZE_COLUMN")),
68                  I18nUtil.valueByKey("SQLENGINE_STRATEGY"),
69                  I18nUtil.valueByKey("SQLENGINE_METADATA")
70              };
71              @Override
72              public int getColumnCount() {
73                  return this.columns.length;
74              }
75              @Override
76              public String getColumnName(int index) {
77                  return this.columns[index];
78              }
79          });
80  
81          this.getColumnModel().getColumn(0).setCellRenderer(new TooltipCellRenderer());
82  
83          DefaultTableCellRenderer centerHorizontalAlignment = new CenterRenderer();
84          this.getColumnModel().getColumn(1).setCellRenderer(centerHorizontalAlignment);
85          this.getColumnModel().getColumn(2).setCellRenderer(centerHorizontalAlignment);
86          this.getColumnModel().getColumn(3).setCellRenderer(new CenterRendererWithIcon());
87          
88          this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), null);
89          this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK), null);
90          
91          Set<AWTKeyStroke> forward = new HashSet<>(this.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
92          forward.add(KeyStroke.getKeyStroke("TAB"));  // required to unlock focus
93          this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward);
94  
95          Set<AWTKeyStroke> backward = new HashSet<>(this.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
96          backward.add(KeyStroke.getKeyStroke("shift TAB"));  // required to unlock focus
97          this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward);
98          
99          this.getColumnModel().getColumn(0).setPreferredWidth(300);
100         this.getColumnModel().getColumn(1).setPreferredWidth(20);
101         this.getColumnModel().getColumn(2).setPreferredWidth(50);
102         this.getColumnModel().getColumn(3).setPreferredWidth(70);
103         
104         this.getSelectionModel().addListSelectionListener(event -> {
105             if (!event.getValueIsAdjusting() && this.getSelectedRow() > -1) {  // prevent double event
106                 var httpHeader = this.listHttpHeader.get(this.getSelectedRow());
107                 tabbedPaneNetworkTab.changeTextNetwork(httpHeader);
108             }
109         });
110         tabbedPaneNetworkTab.getCheckBoxDecode().addActionListener(e -> {
111             MediatorHelper.model().getMediatorUtils().preferencesUtil().withIsUrlDecodeNetworkTab(
112                 tabbedPaneNetworkTab.getCheckBoxDecode().isSelected()
113             ).persist();
114             if (this.getSelectedRow() > -1) {  // prevent double event
115                 var httpHeader = this.listHttpHeader.get(this.getSelectedRow());
116                 tabbedPaneNetworkTab.changeTextNetwork(httpHeader);
117             }
118         });
119     }
120     
121     @Override
122     public boolean isCellEditable(int row, int column) {
123         return false;
124     }
125 
126     public List<Seal.MessageHeader> getListHttpHeader() {
127         return this.listHttpHeader;
128     }
129 
130     public void addHeader(Seal.MessageHeader header) {
131         this.listHttpHeader.add(header);
132     }
133 }