/**
* Copyright 2014 Comcast Cable Communications Management, LLC
*
* This file is part of CATS.
*
* CATS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CATS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CATS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.comcast.cats.vision.panel.trace;
import static com.comcast.cats.vision.util.CatsVisionConstants.APPEND_TRACE_BUTTON_TEXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.BROWSE_BUTTON_TEXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.CLEAR_TRACE_BUTTON_TEXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.CUSTOM_LOG_START_BUTTON_TXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.HEX_STRING_BUTTON_TEXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.SEND_COMMAND_BUTTON_TEXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.START_TRACE_BUTTON_TEXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.STOP_LOGGING_BUTTON_TXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.STOP_TRACE_BUTTON_TEXT;
import static com.comcast.cats.vision.util.CatsVisionConstants.TIME_STAMP_CHECK_BOX_TEXT;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;
import javax.swing.ScrollPaneConstants;
import org.apache.log4j.Logger;
/**
* Trace Panel
*
* @author THusai000
*/
public class TracePanel extends JPanel
{
private String currentCustomTraceLocation = "";
private static final long serialVersionUID = 960156041121295033L;
private String mac;
private static final int COLS = 100;
private static final int ROWS = 30;
private static final int PANEL_WIDTH = 1000;
private static final int PANEL_HEIGHT = 1000;
private static final Dimension PREFERRED_PANEL_SIZE = new Dimension( PANEL_WIDTH, PANEL_HEIGHT );
private static final Dimension PREFERRED_PANE_SIZE = new Dimension( 810, 550 );
/**
* Logger instance for TracePanel.
*/
private static final Logger logger = Logger.getLogger( TracePanel.class );
private JRadioButton appendTraceRadioButton;
private JButton browseButton;
private JButton clearTraceButton;
private JLabel commandLabel;
private JPanel commandSendingPanel;
private JTextField commandTextFld;
private JPanel controlPanel;
private JButton customLogStartButton;
private JTabbedPane generalTabbedPane;
private JRadioButton hexStringRButton;
private JLabel jLabel1;
private JPanel logOptionPanel;
private JRadioButton overwriteTraceRadioButton;
private JButton sendCommandButton;
private JButton startTraceButton;
private JButton stopLoggingButton;
private JButton stopTraceButton;
private JCheckBox timeStampCheckBox;
private JTextField traceFileLocation;
private JLabel traceLocationLabel;
private JScrollPane tracePane;
private JTextArea traceTextArea;
private JFileChooser traceFileSaver;
private ButtonGroup buttonGroup;
/** Creates new form TracePanel */
public TracePanel( String mac )
{
logger.debug( "TracePanel constructor" );
this.mac = mac;
initComponents();
doCustomInit();
setName( mac );
setVisible( true );
}
public void doCustomInit()
{
traceFileSaver = new JFileChooser( "Trace Logs Location" );
traceFileSaver.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
traceFileSaver.setAcceptAllFileFilterUsed( false );
buttonGroup = new ButtonGroup();
buttonGroup.add( appendTraceRadioButton );
buttonGroup.add( overwriteTraceRadioButton );
timeStampCheckBox.setEnabled( false );
traceFileLocation.setEnabled( false );
setPreferredSize( PREFERRED_PANEL_SIZE );
setSize( PREFERRED_PANEL_SIZE );
setMinimumSize( PREFERRED_PANEL_SIZE );
validateAndHighlightStartButton( "" );
}
/**
* This function enables/disables the start/stop button based on the
* file/folder selected.
*
* @param newLocation
*/
protected void validateAndHighlightStartButton( String newLocation )
{
if ( currentCustomTraceLocation.isEmpty() || !currentCustomTraceLocation.equals( newLocation ) )
{
logger.debug( "ValidateHighlight currentTraceLoc: " + currentCustomTraceLocation + "new location:"
+ newLocation );
customLogStartButton.setEnabled( true );
stopLoggingButton.setEnabled( false );
}
else
{
customLogStartButton.setEnabled( false );
stopLoggingButton.setEnabled( true );
}
// This is junk logic..cannot think in a better way.
String filePath = null;
if ( currentCustomTraceLocation.isEmpty() )
{
filePath = newLocation;
}
else
{
filePath = currentCustomTraceLocation;
}
traceFileLocation.setText( filePath );
}
private void initComponents()
{
tracePane = new JScrollPane();
traceTextArea = new JTextArea();
traceLocationLabel = new JLabel();
generalTabbedPane = new JTabbedPane();
controlPanel = new JPanel();
startTraceButton = new JButton();
stopTraceButton = new JButton();
clearTraceButton = new JButton();
commandSendingPanel = new JPanel();
commandTextFld = new JTextField();
hexStringRButton = new JRadioButton();
sendCommandButton = new JButton();
commandLabel = new JLabel();
logOptionPanel = new JPanel();
timeStampCheckBox = new JCheckBox();
customLogStartButton = new JButton();
traceFileLocation = new JTextField();
jLabel1 = new JLabel();
appendTraceRadioButton = new JRadioButton();
overwriteTraceRadioButton = new JRadioButton();
stopLoggingButton = new JButton();
browseButton = new JButton();
setEnabled( false );
setRequestFocusEnabled( false );
setVerifyInputWhenFocusTarget( false );
tracePane.setName( "tracePane" ); // NOI18N
traceTextArea.setBackground( new Color( 204, 204, 204 ) );
traceTextArea.setColumns( COLS );
traceTextArea.setRows( ROWS );
traceTextArea.setDoubleBuffered( true );
traceTextArea.setDragEnabled( true );
traceTextArea.setName( "traceTextArea" ); // NOI18N
tracePane.setViewportView( traceTextArea );
tracePane.setMinimumSize( PREFERRED_PANE_SIZE );
tracePane.setAutoscrolls( true );
tracePane.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED );
tracePane.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED );
if ( mac != null )
{
traceLocationLabel.setText( "Trace Logs for " + mac );
}
else
{
traceLocationLabel.setText( "Trace Logs : " );
}
traceLocationLabel.setName( "traceLocationLabel" ); // NOI18N
generalTabbedPane.setName( "generalTabbedPane" ); // NOI18N
controlPanel.setName( "controlPanel" ); // NOI18N
startTraceButton.setText( START_TRACE_BUTTON_TEXT );
startTraceButton.setName( mac ); // NOI18N
stopTraceButton.setText( STOP_TRACE_BUTTON_TEXT );
stopTraceButton.setName( mac ); // NOI18N
clearTraceButton.setText( CLEAR_TRACE_BUTTON_TEXT );
clearTraceButton.setName( mac ); // NOI18N
GroupLayout controlPanelLayout = new GroupLayout( controlPanel );
controlPanel.setLayout( controlPanelLayout );
controlPanelLayout.setHorizontalGroup( controlPanelLayout.createParallelGroup( GroupLayout.Alignment.LEADING )
.addGroup(
controlPanelLayout.createSequentialGroup().addContainerGap().addComponent( startTraceButton,
GroupLayout.PREFERRED_SIZE, 99, GroupLayout.PREFERRED_SIZE ).addPreferredGap(
LayoutStyle.ComponentPlacement.RELATED ).addComponent( stopTraceButton )
.addPreferredGap( LayoutStyle.ComponentPlacement.RELATED ).addComponent(
clearTraceButton ).addContainerGap( 293, Short.MAX_VALUE ) ) );
controlPanelLayout.setVerticalGroup( controlPanelLayout.createParallelGroup( GroupLayout.Alignment.LEADING )
.addGroup(
controlPanelLayout.createSequentialGroup().addContainerGap().addGroup(
controlPanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).addComponent(
startTraceButton ).addComponent( stopTraceButton ).addComponent(
clearTraceButton ) ).addContainerGap( 38, Short.MAX_VALUE ) ) );
generalTabbedPane.addTab( "General", controlPanel );
commandSendingPanel.setName( mac ); // NOI18N
commandTextFld.setName( "commandTextFld" ); // NOI18N
hexStringRButton.setText( HEX_STRING_BUTTON_TEXT );
hexStringRButton.setName( mac ); // NOI18N
sendCommandButton.setText( SEND_COMMAND_BUTTON_TEXT );
sendCommandButton.setName( mac ); // NOI18N
commandLabel.setText( "Enter Command" );
commandLabel.setName( "commandLabel" ); // NOI18N
GroupLayout commandSendingPanelLayout = new GroupLayout( commandSendingPanel );
commandSendingPanel.setLayout( commandSendingPanelLayout );
commandSendingPanelLayout.setHorizontalGroup( commandSendingPanelLayout.createParallelGroup(
GroupLayout.Alignment.LEADING ).addGroup(
commandSendingPanelLayout.createSequentialGroup().addGroup(
commandSendingPanelLayout.createParallelGroup( GroupLayout.Alignment.LEADING ).addGroup(
commandSendingPanelLayout.createSequentialGroup().addGap( 10, 10, 10 ).addComponent(
commandTextFld, GroupLayout.PREFERRED_SIZE, 119, GroupLayout.PREFERRED_SIZE )
.addGap( 18, 18, 18 ).addComponent( hexStringRButton ).addGap( 18, 18, 18 )
.addComponent( sendCommandButton ) ).addGroup(
commandSendingPanelLayout.createSequentialGroup().addGap( 29, 29, 29 ).addComponent(
commandLabel ) ) ).addContainerGap( 201, Short.MAX_VALUE ) ) );
commandSendingPanelLayout.setVerticalGroup( commandSendingPanelLayout.createParallelGroup(
GroupLayout.Alignment.LEADING ).addGroup(
commandSendingPanelLayout.createSequentialGroup().addComponent( commandLabel ).addPreferredGap(
LayoutStyle.ComponentPlacement.RELATED ).addGroup(
commandSendingPanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).addComponent(
commandTextFld, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE ).addComponent( hexStringRButton ).addComponent(
sendCommandButton ) ).addContainerGap( 29, Short.MAX_VALUE ) ) );
generalTabbedPane.addTab( "Command Sending", commandSendingPanel );
logOptionPanel.setName( "logOptionPanel" ); // NOI18N
timeStampCheckBox.setText( TIME_STAMP_CHECK_BOX_TEXT );
timeStampCheckBox.setName( mac ); // NOI18N
customLogStartButton.setText( CUSTOM_LOG_START_BUTTON_TXT );
customLogStartButton.setName( mac ); // NOI18N
traceFileLocation.setEditable( false );
traceFileLocation.setToolTipText( "Hit browse to specify a folder path" );
traceFileLocation.setName( "traceFileLocation" ); // NOI18N
jLabel1.setText( "Custom Log Location" );
jLabel1.setName( "jLabel1" ); // NOI18N
appendTraceRadioButton.setSelected( true );
appendTraceRadioButton.setText( APPEND_TRACE_BUTTON_TEXT );
appendTraceRadioButton.setName( "appendTraceRadioButton" ); // NOI18N
overwriteTraceRadioButton.setText( "Overwrite Log" );
overwriteTraceRadioButton.setName( "overwriteTraceRadioButton" ); // NOI18N
stopLoggingButton.setText( STOP_LOGGING_BUTTON_TXT );
stopLoggingButton.setName( mac ); // NOI18N
browseButton.setText( BROWSE_BUTTON_TEXT );
browseButton.setName( mac ); // NOI18N
GroupLayout logOptionPanelLayout = new GroupLayout( logOptionPanel );
logOptionPanel.setLayout( logOptionPanelLayout );
logOptionPanelLayout.setHorizontalGroup( logOptionPanelLayout.createParallelGroup(
GroupLayout.Alignment.LEADING ).addGroup(
logOptionPanelLayout.createSequentialGroup().addContainerGap().addGroup(
logOptionPanelLayout.createParallelGroup( GroupLayout.Alignment.LEADING, false ).addGroup(
logOptionPanelLayout.createSequentialGroup().addComponent( jLabel1 ).addGap( 9, 9, 9 )
.addComponent( traceFileLocation, GroupLayout.PREFERRED_SIZE, 221,
GroupLayout.PREFERRED_SIZE ) )
.addGroup(
logOptionPanelLayout.createSequentialGroup().addComponent( timeStampCheckBox )
.addPreferredGap( LayoutStyle.ComponentPlacement.RELATED,
GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).addComponent(
browseButton ) ) ).addGap( 6, 6, 6 ).addGroup(
logOptionPanelLayout.createParallelGroup( GroupLayout.Alignment.LEADING ).addGroup(
logOptionPanelLayout.createSequentialGroup().addComponent( appendTraceRadioButton )
.addPreferredGap( LayoutStyle.ComponentPlacement.RELATED ).addComponent(
overwriteTraceRadioButton ) ).addGroup(
logOptionPanelLayout.createSequentialGroup().addComponent( customLogStartButton,
GroupLayout.PREFERRED_SIZE, 78, GroupLayout.PREFERRED_SIZE ).addPreferredGap(
LayoutStyle.ComponentPlacement.RELATED ).addComponent( stopLoggingButton,
GroupLayout.PREFERRED_SIZE, 79, GroupLayout.PREFERRED_SIZE ) ) ).addGap( 25,
25, 25 ) ) );
logOptionPanelLayout.setVerticalGroup( logOptionPanelLayout.createParallelGroup( GroupLayout.Alignment.LEADING )
.addGroup(
logOptionPanelLayout.createSequentialGroup().addContainerGap( 11, Short.MAX_VALUE ).addGroup(
logOptionPanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE )
.addComponent( traceFileLocation, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE ).addComponent(
jLabel1 ).addComponent( appendTraceRadioButton ).addComponent(
overwriteTraceRadioButton ) ).addPreferredGap(
LayoutStyle.ComponentPlacement.RELATED ).addGroup(
logOptionPanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE )
.addComponent( timeStampCheckBox ).addComponent( customLogStartButton )
.addComponent( stopLoggingButton ).addComponent( browseButton ) )
.addContainerGap() ) );
generalTabbedPane.addTab( "Custom Logging Options", logOptionPanel );
GridBagLayout tracePanelLayout = new GridBagLayout();
setLayout( tracePanelLayout );
GridBagConstraints traceLocationLabelConstraints = new GridBagConstraints();
traceLocationLabelConstraints.gridx = 0;
traceLocationLabelConstraints.gridy = 0;
traceLocationLabelConstraints.gridheight = 1;
traceLocationLabelConstraints.anchor = GridBagConstraints.PAGE_START;
add( traceLocationLabel, traceLocationLabelConstraints );
GridBagConstraints tracePaneConstraints = new GridBagConstraints();
tracePaneConstraints.gridx = 0;
tracePaneConstraints.gridy = 1;
tracePaneConstraints.fill = GridBagConstraints.BOTH;
tracePaneConstraints.anchor = GridBagConstraints.CENTER;
add( tracePane, tracePaneConstraints );
GridBagConstraints generalTabbedPaneConstraints = new GridBagConstraints();
generalTabbedPaneConstraints.gridx = 0;
generalTabbedPaneConstraints.gridy = 2;
generalTabbedPaneConstraints.fill = GridBagConstraints.HORIZONTAL;
generalTabbedPaneConstraints.anchor = GridBagConstraints.PAGE_START;
add( generalTabbedPane, generalTabbedPaneConstraints );
traceLocationLabel.getAccessibleContext().setAccessibleName( mac );
}
public void appendPayload( String payload )
{
traceTextArea.append( payload );
traceTextArea.setCaretPosition( traceTextArea.getDocument().getLength() );
}
/**
* Shows the trace file location file chooser. Saves as only .log files
*/
protected String showTraceFileLocationChooser()
{
// String fileName = "";
String fileName = currentCustomTraceLocation;
int retVal = traceFileSaver.showSaveDialog( this );
if ( retVal == JFileChooser.APPROVE_OPTION )
{
fileName = traceFileSaver.getSelectedFile().getAbsolutePath();
logger.debug( "Trace log file location chosen : " + fileName );
}
return fileName;
}
public String getCurrentCustomTraceLocation()
{
return currentCustomTraceLocation;
}
public void setCurrentCustomTraceLocation( String currentCustomTraceLocation )
{
this.currentCustomTraceLocation = currentCustomTraceLocation;
}
public JRadioButton getAppendTraceRadioButton()
{
return appendTraceRadioButton;
}
public void setAppendTraceRadioButton( JRadioButton appendTraceRadioButton )
{
this.appendTraceRadioButton = appendTraceRadioButton;
}
public JButton getBrowseButton()
{
return browseButton;
}
public void setBrowseButton( JButton browseButton )
{
this.browseButton = browseButton;
}
public JButton getClearTraceButton()
{
return clearTraceButton;
}
public void setClearTraceButton( JButton clearTraceButton )
{
this.clearTraceButton = clearTraceButton;
}
public JLabel getCommandLabel()
{
return commandLabel;
}
public void setCommandLabel( JLabel commandLabel )
{
this.commandLabel = commandLabel;
}
public JPanel getCommandSendingPanel()
{
return commandSendingPanel;
}
public void setCommandSendingPanel( JPanel commandSendingPanel )
{
this.commandSendingPanel = commandSendingPanel;
}
public JTextField getCommandTextFld()
{
return commandTextFld;
}
public void setCommandTextFld( JTextField commandTextFld )
{
this.commandTextFld = commandTextFld;
}
public JPanel getControlPanel()
{
return controlPanel;
}
public void setControlPanel( JPanel controlPanel )
{
this.controlPanel = controlPanel;
}
public JButton getCustomLogStartButton()
{
return customLogStartButton;
}
public void setCustomLogStartButton( JButton customLogStartButton )
{
this.customLogStartButton = customLogStartButton;
}
public JTabbedPane getGeneralTabbedPane()
{
return generalTabbedPane;
}
public void setGeneralTabbedPane( JTabbedPane generalTabbedPane )
{
this.generalTabbedPane = generalTabbedPane;
}
public JRadioButton getHexStringRButton()
{
return hexStringRButton;
}
public void setHexStringRButton( JRadioButton hexStringRButton )
{
this.hexStringRButton = hexStringRButton;
}
public JPanel getLogOptionPanel()
{
return logOptionPanel;
}
public void setLogOptionPanel( JPanel logOptionPanel )
{
this.logOptionPanel = logOptionPanel;
}
public JRadioButton getOverwriteTraceRadioButton()
{
return overwriteTraceRadioButton;
}
public void setOverwriteTraceRadioButton( JRadioButton overwriteTraceRadioButton )
{
this.overwriteTraceRadioButton = overwriteTraceRadioButton;
}
public JButton getSendCommandButton()
{
return sendCommandButton;
}
public void setSendCommandButton( JButton sendCommandButton )
{
this.sendCommandButton = sendCommandButton;
}
public JButton getStartTraceButton()
{
return startTraceButton;
}
public void setStartTraceButton( JButton startTraceButton )
{
this.startTraceButton = startTraceButton;
}
public JButton getStopLoggingButton()
{
return stopLoggingButton;
}
public void setStopLoggingButton( JButton stopLoggingButton )
{
this.stopLoggingButton = stopLoggingButton;
}
public JButton getStopTraceButton()
{
return stopTraceButton;
}
public void setStopTraceButton( JButton stopTraceButton )
{
this.stopTraceButton = stopTraceButton;
}
public JCheckBox getTimeStampCheckBox()
{
return timeStampCheckBox;
}
public void setTimeStampCheckBox( JCheckBox timeStampCheckBox )
{
this.timeStampCheckBox = timeStampCheckBox;
}
public JTextField getTraceFileLocation()
{
return traceFileLocation;
}
public void setTraceFileLocation( JTextField traceFileLocation )
{
this.traceFileLocation = traceFileLocation;
}
public JLabel getTraceLocationLabel()
{
return traceLocationLabel;
}
public void setTraceLocationLabel( JLabel traceLocationLabel )
{
this.traceLocationLabel = traceLocationLabel;
}
public JScrollPane getTracePane()
{
return tracePane;
}
public void setTracePane( JScrollPane tracePane )
{
this.tracePane = tracePane;
}
public TracePanel getTracePanel()
{
return this;
}
public JTextArea getTraceTextArea()
{
return traceTextArea;
}
public void setTraceTextArea( JTextArea traceTextArea )
{
this.traceTextArea = traceTextArea;
}
public JFileChooser getTraceFileSaver()
{
return traceFileSaver;
}
public void setTraceFileSaver( JFileChooser traceFileSaver )
{
this.traceFileSaver = traceFileSaver;
}
public ButtonGroup getButtonGroup()
{
return buttonGroup;
}
public void setButtonGroup( ButtonGroup buttonGroup )
{
this.buttonGroup = buttonGroup;
}
public boolean isAppendRadioButtonSelected()
{
return appendTraceRadioButton.isSelected();
}
public void addActionListener( ActionListener listener )
{
startTraceButton.addActionListener( listener );
stopTraceButton.addActionListener( listener );
clearTraceButton.addActionListener( listener );
hexStringRButton.addActionListener( listener );
sendCommandButton.addActionListener( listener );
timeStampCheckBox.addActionListener( listener );
customLogStartButton.addActionListener( listener );
stopLoggingButton.addActionListener( listener );
browseButton.addActionListener( listener );
}
public void removeActionListener( ActionListener listener )
{
startTraceButton.removeActionListener( listener );
stopTraceButton.removeActionListener( listener );
clearTraceButton.removeActionListener( listener );
hexStringRButton.removeActionListener( listener );
sendCommandButton.removeActionListener( listener );
timeStampCheckBox.removeActionListener( listener );
customLogStartButton.removeActionListener( listener );
stopLoggingButton.removeActionListener( listener );
browseButton.removeActionListener( listener );
}
}