blob: f2ddf10962145656760caf53ac1136f73f05738b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.web.webkit.tooling.networkmonitor;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.ListSelectionModel;
import javax.swing.SortOrder;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import org.openide.text.CloneableEditorSupport;
import org.openide.windows.TopComponent;
import org.openide.util.NbBundle.Messages;
import org.openide.util.NbPreferences;
import org.openide.windows.IOContainer;
import org.openide.windows.IOProvider;
import org.openide.windows.InputOutput;
import org.openide.windows.RetainLocation;
@TopComponent.Description(
preferredID = "NetworkMonitorTopComponent",
persistenceType = TopComponent.PERSISTENCE_NEVER)
@RetainLocation(value = "output")
@Messages({
"CTL_NetworkMonitorTopComponent=Network Monitor",
"HINT_NetworkMonitorTopComponent=This is a Network Monitor window"
})
public final class NetworkMonitorTopComponent extends TopComponent
implements TableModelListener, ChangeListener {
private Model model;
private final InputOutput io;
private final MyProvider ioProvider;
private final UIUpdater updater;
private boolean debuggingSession;
NetworkMonitorTopComponent(Model m, boolean debuggingSession) {
assert SwingUtilities.isEventDispatchThread();
this.debuggingSession = debuggingSession;
initComponents();
jResponse.setEditorKit(CloneableEditorSupport.getEditorKit("text/plain"));
setName(Bundle.CTL_NetworkMonitorTopComponent());
setToolTipText(Bundle.HINT_NetworkMonitorTopComponent());
updater = new UIUpdater(this);
setModel(m, debuggingSession);
initRequestTable();
jSplitPane.setDividerLocation(NbPreferences.forModule(NetworkMonitorTopComponent.class).getInt("separator", 200));
selectedItemChanged();
updateVisibility();
ioProvider = new MyProvider(jIOContainerPlaceholder);
IOContainer container = IOContainer.create(ioProvider);
io = IOProvider.getDefault().getIO("callstack", new Action[0], container);
}
/**
* Initializes the request table.
*/
private void initRequestTable() {
requestTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
requestTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedItemChanged();
}
});
}
private static class UIUpdater implements ActionListener {
private final Timer t;
private final NetworkMonitorTopComponent comp;
private ModelItem modelItem;
public UIUpdater(NetworkMonitorTopComponent comp) {
this.comp = comp;
t = new Timer(200, this);
t.setRepeats(false);
}
@Override
public void actionPerformed(ActionEvent e) {
comp._refreshDetailsView(modelItem);
}
public synchronized void showItem(ModelItem mi) {
t.stop();
modelItem = mi;
t.start();
}
}
void setModel(Model model, boolean debuggingSession) {
this.model = model;
this.debuggingSession = debuggingSession;
TableModel tableModel = requestTable.getModel();
if (tableModel != null) {
tableModel.removeTableModelListener(this);
}
requestTable.setModel(model);
requestTable.setRowSorter(new TriStateRowSorter(model));
model.addTableModelListener(this);
selectedItemChanged();
updateVisibility();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jSplitPane = new javax.swing.JSplitPane();
jPanel3 = new javax.swing.JPanel();
jClear = new javax.swing.JButton();
requestTableScrollPane = new javax.swing.JScrollPane();
requestTable = new javax.swing.JTable();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jTabbedPane1 = new javax.swing.JTabbedPane();
jHeadersPanel = new javax.swing.JPanel();
jScrollPane5 = new javax.swing.JScrollPane();
jHeaders = new javax.swing.JTextPane();
jRequestPanel = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
jRequest = new javax.swing.JEditorPane();
jRawResponseRequest = new javax.swing.JCheckBox();
jResponsePanel = new javax.swing.JPanel();
jRawResponseResponse = new javax.swing.JCheckBox();
jScrollPane3 = new javax.swing.JScrollPane();
jResponse = new javax.swing.JEditorPane();
jFramesPanel = new javax.swing.JPanel();
jScrollPane4 = new javax.swing.JScrollPane();
jFrames = new javax.swing.JTextPane();
jRawResponseFrames = new javax.swing.JCheckBox();
jCallStackPanel = new javax.swing.JPanel();
jIOContainerPlaceholder = new javax.swing.JPanel();
jNoData = new javax.swing.JLabel();
jNoConnection = new javax.swing.JLabel();
jClear.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/netbeans/modules/web/webkit/tooling/networkmonitor/delete.gif"))); // NOI18N
jClear.setToolTipText(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jClear.tooltip")); // NOI18N
jClear.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jClearActionPerformed(evt);
}
});
requestTableScrollPane.setViewportView(requestTable);
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jClear)
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(requestTableScrollPane)
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jClear)
.addGap(0, 0, 0)
.addComponent(requestTableScrollPane))
);
jSplitPane.setLeftComponent(jPanel3);
jHeadersPanel.setName(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jHeadersPanel.TabConstraints.tabTitle")); // NOI18N
jHeaders.setEditable(false);
jScrollPane5.setViewportView(jHeaders);
javax.swing.GroupLayout jHeadersPanelLayout = new javax.swing.GroupLayout(jHeadersPanel);
jHeadersPanel.setLayout(jHeadersPanelLayout);
jHeadersPanelLayout.setHorizontalGroup(
jHeadersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane5)
);
jHeadersPanelLayout.setVerticalGroup(
jHeadersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane5)
);
jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jHeadersPanel.TabConstraints.tabTitle"), jHeadersPanel); // NOI18N
jRequestPanel.setName(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.Request Data.TabConstraints.tabTitle")); // NOI18N
jRequest.setEditable(false);
jScrollPane2.setViewportView(jRequest);
org.openide.awt.Mnemonics.setLocalizedText(jRawResponseRequest, org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jRawResponseRequest.text")); // NOI18N
jRawResponseRequest.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
jRawResponseRequestItemStateChanged(evt);
}
});
javax.swing.GroupLayout jRequestPanelLayout = new javax.swing.GroupLayout(jRequestPanel);
jRequestPanel.setLayout(jRequestPanelLayout);
jRequestPanelLayout.setHorizontalGroup(
jRequestPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2)
.addGroup(jRequestPanelLayout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jRawResponseRequest))
);
jRequestPanelLayout.setVerticalGroup(
jRequestPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jRequestPanelLayout.createSequentialGroup()
.addComponent(jScrollPane2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jRawResponseRequest))
);
jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jRequestPanel.TabConstraints.tabTitle"), jRequestPanel); // NOI18N
jResponsePanel.setName(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jResponsePanel.TabConstraints.tabTitle")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jRawResponseResponse, org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jRawResponseResponse.text")); // NOI18N
jRawResponseResponse.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
jRawResponseResponseItemStateChanged(evt);
}
});
jResponse.setEditable(false);
jScrollPane3.setViewportView(jResponse);
javax.swing.GroupLayout jResponsePanelLayout = new javax.swing.GroupLayout(jResponsePanel);
jResponsePanel.setLayout(jResponsePanelLayout);
jResponsePanelLayout.setHorizontalGroup(
jResponsePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jResponsePanelLayout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jRawResponseResponse))
.addComponent(jScrollPane3)
);
jResponsePanelLayout.setVerticalGroup(
jResponsePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jResponsePanelLayout.createSequentialGroup()
.addComponent(jScrollPane3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jRawResponseResponse))
);
jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jResponsePanel.TabConstraints.tabTitle"), jResponsePanel); // NOI18N
jFramesPanel.setName(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jFramesPanel.TabConstraints.tabTitle")); // NOI18N
jScrollPane4.setViewportView(jFrames);
org.openide.awt.Mnemonics.setLocalizedText(jRawResponseFrames, org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jRawResponseFrames.text")); // NOI18N
jRawResponseFrames.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
jRawResponseFramesItemStateChanged(evt);
}
});
javax.swing.GroupLayout jFramesPanelLayout = new javax.swing.GroupLayout(jFramesPanel);
jFramesPanel.setLayout(jFramesPanelLayout);
jFramesPanelLayout.setHorizontalGroup(
jFramesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFramesPanelLayout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jRawResponseFrames))
.addComponent(jScrollPane4)
);
jFramesPanelLayout.setVerticalGroup(
jFramesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jFramesPanelLayout.createSequentialGroup()
.addComponent(jScrollPane4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jRawResponseFrames))
);
jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jFramesPanel.TabConstraints.tabTitle"), jFramesPanel); // NOI18N
jCallStackPanel.setName(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jCallStackPanel.TabConstraints.tabTitle")); // NOI18N
javax.swing.GroupLayout jIOContainerPlaceholderLayout = new javax.swing.GroupLayout(jIOContainerPlaceholder);
jIOContainerPlaceholder.setLayout(jIOContainerPlaceholderLayout);
jIOContainerPlaceholderLayout.setHorizontalGroup(
jIOContainerPlaceholderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
jIOContainerPlaceholderLayout.setVerticalGroup(
jIOContainerPlaceholderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
javax.swing.GroupLayout jCallStackPanelLayout = new javax.swing.GroupLayout(jCallStackPanel);
jCallStackPanel.setLayout(jCallStackPanelLayout);
jCallStackPanelLayout.setHorizontalGroup(
jCallStackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jIOContainerPlaceholder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
jCallStackPanelLayout.setVerticalGroup(
jCallStackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jIOContainerPlaceholder, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jCallStackPanel.TabConstraints.tabTitle"), jCallStackPanel); // NOI18N
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTabbedPane1))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTabbedPane1))
);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jSplitPane.setRightComponent(jPanel1);
org.openide.awt.Mnemonics.setLocalizedText(jNoData, org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jNoData.text")); // NOI18N
jNoData.setVerticalAlignment(javax.swing.SwingConstants.TOP);
jNoData.setBorder(javax.swing.BorderFactory.createEmptyBorder(12, 12, 1, 1));
org.openide.awt.Mnemonics.setLocalizedText(jNoConnection, org.openide.util.NbBundle.getMessage(NetworkMonitorTopComponent.class, "NetworkMonitorTopComponent.jNoConnection.text")); // NOI18N
jNoConnection.setVerticalAlignment(javax.swing.SwingConstants.TOP);
jNoConnection.setBorder(javax.swing.BorderFactory.createEmptyBorder(12, 12, 1, 1));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSplitPane)
.addComponent(jNoData)
.addComponent(jNoConnection)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jSplitPane)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jNoData, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jNoConnection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);
}// </editor-fold>//GEN-END:initComponents
private void jRawResponseResponseItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jRawResponseResponseItemStateChanged
ModelItem mi = lastSelectedItem;
if (mi != null) {
refreshDetailsView(mi);
}
}//GEN-LAST:event_jRawResponseResponseItemStateChanged
private void jRawResponseRequestItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jRawResponseRequestItemStateChanged
ModelItem mi = lastSelectedItem;
if (mi != null) {
refreshDetailsView(mi);
}
}//GEN-LAST:event_jRawResponseRequestItemStateChanged
private void jRawResponseFramesItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jRawResponseFramesItemStateChanged
ModelItem mi = lastSelectedItem;
if (mi != null) {
refreshDetailsView(mi);
}
}//GEN-LAST:event_jRawResponseFramesItemStateChanged
private void jClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jClearActionPerformed
resetModel();
}//GEN-LAST:event_jClearActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel jCallStackPanel;
private javax.swing.JButton jClear;
private javax.swing.JTextPane jFrames;
private javax.swing.JPanel jFramesPanel;
private javax.swing.JTextPane jHeaders;
private javax.swing.JPanel jHeadersPanel;
private javax.swing.JPanel jIOContainerPlaceholder;
private javax.swing.JLabel jNoConnection;
private javax.swing.JLabel jNoData;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JCheckBox jRawResponseFrames;
private javax.swing.JCheckBox jRawResponseRequest;
private javax.swing.JCheckBox jRawResponseResponse;
private javax.swing.JEditorPane jRequest;
private javax.swing.JPanel jRequestPanel;
private javax.swing.JEditorPane jResponse;
private javax.swing.JPanel jResponsePanel;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JSplitPane jSplitPane;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTable requestTable;
private javax.swing.JScrollPane requestTableScrollPane;
// End of variables declaration//GEN-END:variables
@Override
public void componentClosed() {
setReopenNetworkComponent(false);
model.passivate();
// avoid memory leaks
model.removeTableModelListener(this);
// avoid memory leaks
requestTable.setModel(new DefaultTableModel());
ioProvider.close();
NbPreferences.forModule(NetworkMonitorTopComponent.class).putInt("separator", jSplitPane.getDividerLocation());
}
static boolean canReopenNetworkComponent() {
return NbPreferences.forModule(NetworkMonitorTopComponent.class).getBoolean("reopen", true);
}
static void setReopenNetworkComponent(boolean b) {
NbPreferences.forModule(NetworkMonitorTopComponent.class).putBoolean("reopen", b);
}
private ModelItem lastSelectedItem = null;
private void selectedItemChanged() {
assert SwingUtilities.isEventDispatchThread();
int index = requestTable.getSelectedRow();
if (index != -1) {
index = requestTable.convertRowIndexToModel(index);
}
final ModelItem mi = model.getItem(index);
if (lastSelectedItem == mi) {
return;
} else {
if (lastSelectedItem != null) {
lastSelectedItem.setChangeListener(null);
}
lastSelectedItem = mi;
if (lastSelectedItem != null) {
lastSelectedItem.setChangeListener(this);
}
}
refreshDetailsView(lastSelectedItem);
}
private void refreshDetailsView(ModelItem mi) {
updater.showItem(mi);
}
private void _refreshDetailsView(ModelItem mi) {
assert SwingUtilities.isEventDispatchThread();
if (mi != null) {
mi.updateHeadersPane(jHeaders);
mi.updateResponsePane(jResponse, jRawResponseResponse.isSelected());
mi.updateFramesPane(jFrames, jRawResponseFrames.isSelected());
mi.updatePostDataPane(jRequest, jRawResponseRequest.isSelected());
mi.updateCallStack(io);
}
updateTabVisibility(mi);
}
private void updateVisibility() {
boolean empty = model.getRowCount() == 0;
jSplitPane.setVisible(!empty);
jNoData.setVisible(empty && debuggingSession);
jNoConnection.setVisible(empty && !debuggingSession);
if (!empty && requestTable.getSelectedRow() == -1) {
refreshDetailsView(null);
}
}
@Override
public void tableChanged(TableModelEvent e) {
updateVisibility();
}
@Override
public void stateChanged(ChangeEvent e) {
refreshDetailsView(lastSelectedItem);
}
void resetModel() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
model.reset();
}
});
}
private void updateTabVisibility(ModelItem mi) {
int index = 0;
// Header - always visible
boolean showHeaders = mi != null;
index = showHideTab(jHeadersPanel, showHeaders, index);
// Request Data:
boolean postDataVisible = mi != null && mi.hasPostData();
index = showHideTab(jRequestPanel, postDataVisible, index);
// Response:
boolean hasResponseData = mi != null && mi.hasResponseData();
index = showHideTab(jResponsePanel, hasResponseData, index);
// Frames:
boolean hasFrames = mi != null && mi.hasFrames();
index = showHideTab(jFramesPanel, hasFrames, index);
// Call Stack:
boolean hasCallStack = mi != null && mi.hasCallStack();
showHideTab(jCallStackPanel, hasCallStack, index);
}
private int showHideTab(JPanel jPanel, boolean show, int index) {
Component comp = index < jTabbedPane1.getTabCount() ? jTabbedPane1.getComponentAt(index) : null;
if (show) {
if (jPanel != comp) {
jTabbedPane1.add(jPanel, index);
}
return index+1;
} else {
if (jPanel == comp) {
jTabbedPane1.remove(index);
}
return index;
}
}
public static class JTextPaneNonWrapping extends JTextPane {
public JTextPaneNonWrapping() {
}
@Override
public boolean getScrollableTracksViewportWidth() {
Component parent = getParent();
return parent != null ? (getUI().getPreferredSize(this).width <= parent
.getSize().width) : true;
}
}
private static class MyProvider implements IOContainer.Provider {
private JPanel parent;
public MyProvider(JPanel parent) {
this.parent = parent;
}
@Override
public void open() {
}
@Override
public void requestActive() {
}
@Override
public void requestVisible() {
}
@Override
public boolean isActivated() {
return false;
}
@Override
public void add(JComponent comp, IOContainer.CallBacks cb) {
assert parent != null;
parent.setLayout(new BorderLayout());
parent.add(comp, BorderLayout.CENTER);
}
@Override
public void remove(JComponent comp) {
assert parent != null;
parent.remove(comp);
}
@Override
public void select(JComponent comp) {
}
@Override
public JComponent getSelected() {
return null;
}
@Override
public void setTitle(JComponent comp, String name) {
}
@Override
public void setToolTipText(JComponent comp, String text) {
}
@Override
public void setIcon(JComponent comp, Icon icon) {
}
@Override
public void setToolbarActions(JComponent comp, Action[] toolbarActions) {
}
@Override
public boolean isCloseable(JComponent comp) {
return false;
}
private void close() {
parent = null;
}
}
/**
* Table row sorter that cycles between ascending, descending and unsorted orders.
*/
public static class TriStateRowSorter extends TableRowSorter<TableModel> {
public TriStateRowSorter(TableModel model) {
super(model);
}
@Override
public void toggleSortOrder(int column) {
List<? extends SortKey> sortKeys = getSortKeys();
if (!sortKeys.isEmpty()) {
SortKey sortKey = sortKeys.get(0);
if (sortKey.getColumn() == column && sortKey.getSortOrder() == SortOrder.DESCENDING) {
setSortKeys(null);
return;
}
}
super.toggleSortOrder(column);
}
}
}