/* * * Paros and its related class files. * * Paros is an HTTP/HTTPS proxy for assessing web application security. * Copyright (C) 2003-2004 Chinotec Technologies Company * * This program is free software; you can redistribute it and/or * modify it under the terms of the Clarified Artistic License * as published by the Free Software Foundation. * * This program 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 * Clarified Artistic License for more details. * * You should have received a copy of the Clarified Artistic License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // ZAP: 2012/04/23 Added @Override annotation to all appropriate methods. // ZAP: 2012/04/28 Added logger and log of exception. // ZAP: 2013/11/16 Issue 886: Main pop up menu invoked twice on some components // ZAP: 2013/11/16 Issue 890: Allow to clear "Output" tab // ZAP: 2014/01/28 Issue 207: Support keyboard shortcuts // ZAP: 2014/04/25 Issue 642: Add timestamps to Output tab(s) // ZAP: 2014/10/07 Issue 1357: Hide unused tabs // ZAP: 2015/02/10 Issue 1528: Support user defined font size // ZAP: 2017/02/20 Issue 3221: Some icons not scaled correctly package org.parosproxy.paros.view; import java.awt.BorderLayout; import java.awt.Event; import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.event.KeyEvent; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToolBar; import javax.swing.KeyStroke; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.log4j.Logger; import org.parosproxy.paros.Constant; import org.parosproxy.paros.extension.AbstractPanel; import org.parosproxy.paros.model.Model; import org.zaproxy.zap.utils.DisplayUtils; import org.zaproxy.zap.utils.TimeStampUtils; import org.zaproxy.zap.utils.ZapTextArea; public class OutputPanel extends AbstractPanel { private static final long serialVersionUID = -947074835463140074L; // ZAP: Added logger. private static final Logger logger = Logger.getLogger(OutputPanel.class); private static final String CLEAR_BUTTON_LABEL = Constant.messages.getString("output.panel.clear.button.label"); private static final String CLEAR_BUTTON_TOOL_TIP = Constant.messages.getString("output.panel.clear.button.toolTip"); private JPanel mainPanel; private JToolBar mainToolBar; private JScrollPane jScrollPane = null; private ZapTextArea txtOutput = null; public OutputPanel() { super(); initialize(); } /** * This method initializes this */ private void initialize() { this.setLayout(new BorderLayout()); this.setName(Constant.messages.getString("output.panel.title")); // ZAP: i18n if (Model.getSingleton().getOptionsParam().getViewParam().getWmUiHandlingOption() == 0) { this.setSize(243, 119); } // ZAP: Added Output (doc) icon this.setIcon(new ImageIcon(OutputPanel.class.getResource("/resource/icon/16/172.png"))); // 'doc' icon this.setDefaultAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | Event.SHIFT_MASK, false)); this.setMnemonic(Constant.messages.getChar("output.panel.mnemonic")); this.add(getMainPanel(), BorderLayout.CENTER); this.setShowByDefault(true); } private JPanel getMainPanel() { if (mainPanel == null) { mainPanel = new JPanel(new BorderLayout()); mainPanel.add(getToolBar(), BorderLayout.PAGE_START); mainPanel.add(getJScrollPane(), BorderLayout.CENTER); } return mainPanel; } private JToolBar getToolBar() { if (mainToolBar == null) { mainToolBar = new JToolBar(); mainToolBar.setEnabled(true); mainToolBar.setFloatable(false); mainToolBar.setRollover(true); JButton clearButton = new JButton(CLEAR_BUTTON_LABEL); clearButton.setToolTipText(CLEAR_BUTTON_TOOL_TIP); clearButton.setIcon(DisplayUtils.getScaledIcon(new ImageIcon(OutputPanel.class.getResource("/resource/icon/fugue/broom.png")))); clearButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { getTxtOutput().setText(""); }; }); mainToolBar.add(clearButton); } return mainToolBar; } /** * This method initializes jScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setViewportView(getTxtOutput()); jScrollPane.setName("jScrollPane"); jScrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); } return jScrollPane; } /** * This method initializes txtOutput * * @return org.zaproxy.zap.utils.ZapTextArea */ private ZapTextArea getTxtOutput() { if (txtOutput == null) { txtOutput = new ZapTextArea(); txtOutput.setEditable(false); txtOutput.setLineWrap(true); txtOutput.setName(""); txtOutput.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mousePressed(java.awt.event.MouseEvent e) { showPopupMenuIfTriggered(e); } @Override public void mouseReleased(java.awt.event.MouseEvent e) { showPopupMenuIfTriggered(e); } private void showPopupMenuIfTriggered(java.awt.event.MouseEvent e) { if (e.isPopupTrigger()) { View.getSingleton().getPopupMenu().show(e.getComponent(), e.getX(), e.getY()); } } }); } return txtOutput; } /** * @deprecated * appendDirty has been deprecated in favour of using {@link #append(String)} */ @Deprecated public void appendDirty(final String msg) { doAppend(msg); //Mimic old behavior } public void append(final String msg) { if (EventQueue.isDispatchThread()) { doAppend(msg); return; } try { EventQueue.invokeAndWait(new Runnable() { @Override public void run() { doAppend(msg); } }); } catch (Exception e) { // ZAP: Added logging. logger.error(e.getMessage(), e); } } // ZAP: New method for printing out stack traces public void append(final Exception e) { append(ExceptionUtils.getStackTrace(e)); } public void clear() { getTxtOutput().setText(""); } private void doAppend(String message){ if (Model.getSingleton().getOptionsParam().getViewParam().isOutputTabTimeStampingEnabled()) getTxtOutput().append(TimeStampUtils.getTimeStampedMessage(message,Model.getSingleton().getOptionsParam().getViewParam().getOutputTabTimeStampsFormat())); else getTxtOutput().append(message); } /** * Appends the given {@code message} to the panel, asynchronously in the EDT. * * @param message the message to append to the output panel * @since 2.5.0 * @see EventQueue#invokeLater(Runnable) */ public void appendAsync(final String message) { EventQueue.invokeLater(new Runnable() { @Override public void run() { doAppend(message); } }); } } // @jve:decl-index=0:visual-constraint="10,10"