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