/*
* soapUI, copyright (C) 2004-2011 eviware.com
*
* soapUI is free software; you can redistribute it and/or modify it under the
* terms of version 2.1 of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* soapUI 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 Lesser General Public License for more details at gnu.org.
*/
package com.eviware.soapui.security.panels;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.tree.AbstractLayoutCache;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import org.jdesktop.swingx.JXTree;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.SecurityScanConfig;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.model.security.SecurityScan;
import com.eviware.soapui.model.support.TestSuiteListenerAdapter;
import com.eviware.soapui.model.testsuite.TestCaseRunner;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.model.testsuite.TestSuiteListener;
import com.eviware.soapui.security.Securable;
import com.eviware.soapui.security.SecurityTest;
import com.eviware.soapui.security.SecurityTestListener;
import com.eviware.soapui.security.SecurityTestRunContext;
import com.eviware.soapui.security.actions.CloneParametersAction;
import com.eviware.soapui.security.log.JSecurityTestRunLog;
import com.eviware.soapui.security.scan.AbstractSecurityScanWithProperties;
import com.eviware.soapui.security.support.SecurityTestRunListenerAdapter;
import com.eviware.soapui.security.ui.SecurityConfigurationDialog;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.swing.TreePathUtils;
/**
* A panel showing a scrollable list of TestSteps in a SecurityTest.
*
* @author dragica.soldo
*/
@SuppressWarnings( "serial" )
public class JSecurityTestTestStepList extends JPanel implements TreeSelectionListener, MouseListener,
SecurityTestListener
{
private SecurityTest securityTest;
private final TestSuiteListener testSuiteListener = new InternalTestSuiteListener();
private JXTree securityTestTree;
private AddSecurityScanAction addSecurityScanAction;
private ConfigureSecurityScanAction configureSecurityScanAction;
private RemoveSecurityScanAction removeSecurityScanAction;
private CloneParametersAction cloneParametersAction;
private JSecurityTestRunLog securityTestLog;
private JPopupMenu securityScanPopUp;
private JPopupMenu securityScanWithPropertiesPopUp;
private JPopupMenu testStepPopUp;
private SecurityTreeCellRender cellRender;
private SecurityScanTree treeModel;
private InternalSecurityTestRunListener testRunListener;
private JScrollPane scrollPane;
private EnableDisableSecurityScan enableDisableSecurityScan;
private JPopupMenu multySecurityScanPopUp;
protected boolean multypopupvisible;
private EnableSecurityScans enableSecurityScansAction;
private DisableSecurityScans disableSecurityScansAction;
private ShowOnlineHelpAction showOnlineHelpAction;
private OpenTestStepEditorAction openTestStepEditorAction;
public JSecurityTestTestStepList( SecurityTest securityTest, JSecurityTestRunLog securityTestLog )
{
this.securityTest = securityTest;
setLayout( new BorderLayout() );
JXToolBar toolbar = initToolbar();
securityScanPopUp = new JPopupMenu();
securityScanPopUp.add( enableDisableSecurityScan = new EnableDisableSecurityScan() );
securityScanPopUp.add( configureSecurityScanAction );
securityScanPopUp.addSeparator();
securityScanPopUp.add( removeSecurityScanAction );
showOnlineHelpAction = new ShowOnlineHelpAction( HelpUrls.RESPONSE_ASSERTIONS_HELP_URL );
securityScanPopUp.add( showOnlineHelpAction );
securityScanWithPropertiesPopUp = new JPopupMenu();
securityScanWithPropertiesPopUp.add( enableDisableSecurityScan );
securityScanWithPropertiesPopUp.add( configureSecurityScanAction );
securityScanWithPropertiesPopUp.add( cloneParametersAction );
securityScanWithPropertiesPopUp.addSeparator();
securityScanWithPropertiesPopUp.add( removeSecurityScanAction );
securityScanWithPropertiesPopUp.add( showOnlineHelpAction );
multySecurityScanPopUp = new JPopupMenu();
enableSecurityScansAction = new EnableSecurityScans();
disableSecurityScansAction = new DisableSecurityScans();
populateMultySecurityScanPopup( true, true );
multySecurityScanPopUp.addPopupMenuListener( new PopupMenuListener()
{
@Override
public void popupMenuWillBecomeVisible( PopupMenuEvent arg0 )
{
multypopupvisible = true;
}
@Override
public void popupMenuWillBecomeInvisible( PopupMenuEvent arg0 )
{
// TODO Auto-generated method stub
}
@Override
public void popupMenuCanceled( PopupMenuEvent arg0 )
{
// TODO Auto-generated method stub
}
} );
testStepPopUp = new JPopupMenu();
initTestStepPopUpActions();
testStepPopUp.addSeparator();
testStepPopUp.add( new ShowOnlineHelpAction( HelpUrls.RESPONSE_ASSERTIONS_HELP_URL ) );
treeModel = new SecurityScanTree( securityTest, new SecurityTreeRootNode( securityTest ) );
securityTestTree = new JXTree( treeModel );
securityTestTree.putClientProperty( "JTree.lineStyle", "None" );
securityTestTree.setUI( new CustomTreeUI() );
securityTestTree.setRootVisible( false );
securityTestTree.setLargeModel( true );
cellRender = new SecurityTreeCellRender();
securityTestTree.setCellRenderer( cellRender );
securityTestTree.getSelectionModel().setSelectionMode( TreeSelectionModel.CONTIGUOUS_TREE_SELECTION );
securityTestTree.addTreeSelectionListener( this );
securityTestTree.addMouseListener( this );
securityTestTree.setRowHeight( 30 );
securityTestTree.setToggleClickCount( 0 );
securityTestTree.setBackground( new Color( 240, 240, 240 ) );
securityTestTree.setScrollsOnExpand( true );
add( toolbar, BorderLayout.NORTH );
scrollPane = new JScrollPane( securityTestTree );
scrollPane.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
add( scrollPane, BorderLayout.CENTER );
securityTest.getTestCase().getTestSuite().addTestSuiteListener( testSuiteListener );
securityTest.addSecurityTestListener( this );
testRunListener = new InternalSecurityTestRunListener();
securityTest.addSecurityTestRunListener( testRunListener );
for( int row = 0; row < securityTestTree.getRowCount(); row++ )
{
securityTestTree.expandRow( row );
}
this.securityTestLog = securityTestLog;
}
private void populateMultySecurityScanPopup( boolean addEnableAction, boolean addDisableAction )
{
multySecurityScanPopUp.removeAll();
if( addEnableAction )
{
multySecurityScanPopUp.add( enableSecurityScansAction );
}
if( addDisableAction )
{
multySecurityScanPopUp.add( disableSecurityScansAction );
}
multySecurityScanPopUp.addSeparator();
multySecurityScanPopUp.add( removeSecurityScanAction );
multySecurityScanPopUp.add( showOnlineHelpAction );
}
protected SecurityTest getSecurityTest()
{
return securityTest;
}
protected void setSecurityTest( SecurityTest securityTest )
{
this.securityTest = securityTest;
}
protected JPopupMenu getTestStepPopUp()
{
return testStepPopUp;
}
protected void initTestStepPopUpActions()
{
testStepPopUp.add( openTestStepEditorAction );
testStepPopUp.add( addSecurityScanAction );
}
protected JPopupMenu getSecurityScanPopUp()
{
return securityScanPopUp;
}
private JXToolBar initToolbar()
{
JXToolBar toolbar = UISupport.createToolbar();
initToolbarLeft( toolbar );
JButton expandActionBtn = UISupport.createToolbarButton( new ExpandTreeAction() );
expandActionBtn.setText( "Expanded" );
expandActionBtn.setPreferredSize( new Dimension( 80, 21 ) );
JButton collapsActionBtn = UISupport.createToolbarButton( new CollapsTreeAction() );
collapsActionBtn.setText( "Collapsed" );
collapsActionBtn.setPreferredSize( new Dimension( 80, 21 ) );
toolbar.addGlue();
toolbar.add( expandActionBtn );
toolbar.add( collapsActionBtn );
return toolbar;
}
protected void initToolbarLeft( JXToolBar toolbar )
{
addSecurityScanAction = new AddSecurityScanAction();
configureSecurityScanAction = new ConfigureSecurityScanAction();
removeSecurityScanAction = new RemoveSecurityScanAction();
cloneParametersAction = new CloneParametersAction();
openTestStepEditorAction = new OpenTestStepEditorAction();
toolbar.addFixed( UISupport.createToolbarButton( addSecurityScanAction ) );
toolbar.addFixed( UISupport.createToolbarButton( configureSecurityScanAction ) );
toolbar.addFixed( UISupport.createToolbarButton( removeSecurityScanAction ) );
toolbar.addFixed( UISupport.createToolbarButton( cloneParametersAction ) );
}
protected JComponent buildSecurityScanInspector()
{
JPanel p = new JPanel( new BorderLayout() );
return p;
}
@Override
public void addNotify()
{
super.addNotify();
securityTest.getTestCase().getTestSuite().addTestSuiteListener( testSuiteListener );
}
@Override
public void removeNotify()
{
super.removeNotify();
securityTest.getTestCase().getTestSuite().removeTestSuiteListener( testSuiteListener );
}
private final class InternalTestSuiteListener extends TestSuiteListenerAdapter
{
@Override
public void testStepAdded( TestStep testStep, int index )
{
( ( SecurityScanTree )securityTestTree.getModel() ).insertNodeInto( testStep );
}
@Override
public void testStepRemoved( TestStep testStep, int index )
{
TestStepNode node = ( ( SecurityScanTree )securityTestTree.getModel() ).getTestStepNode( testStep );
for( int cnt = 0; cnt < node.getChildCount(); cnt++ )
{
SecurityScanNode nodeCld = ( SecurityScanNode )node.getChildAt( cnt );
cellRender.remove( nodeCld );
treeModel.removeNodeFromParent( nodeCld );
}
cellRender.remove( node );
treeModel.removeNodeFromParent( node );
}
@Override
public void testStepMoved( TestStep testStep, int index, int offset )
{
TreePath path = treeModel.moveTestStepNode( testStep, index, offset );
securityTestTree.expandPath( path );
securityTestTree.setSelectionPath( path );
}
}
public class OpenTestStepEditorAction extends AbstractAction
{
public OpenTestStepEditorAction()
{
super( "Open Editor" );
putValue( Action.SHORT_DESCRIPTION, "Opens the editor for this TestStep" );
setEnabled( true );
}
@Override
public void actionPerformed( ActionEvent e )
{
TestStepNode node = ( TestStepNode )securityTestTree.getLastSelectedPathComponent();
UISupport.selectAndShow( ( ( TestStepNode )node ).getTestStep() );
}
}
// toolbar actions
public class AddSecurityScanAction extends AbstractAction
{
public AddSecurityScanAction()
{
super( "Add SecurityScan" );
putValue( Action.SHORT_DESCRIPTION, "Adds a security scan to this item" );
putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/add_security_scan.gif" ) );
setEnabled( false );
}
public void actionPerformed( ActionEvent e )
{
TestStepNode node = ( TestStepNode )securityTestTree.getLastSelectedPathComponent();
if( !node.getAllowsChildren() )
{
return;
}
TestStep testStep = node.getTestStep();
String[] availableScanNames = SoapUI.getSoapUICore().getSecurityScanRegistry()
.getAvailableSecurityScansNames( testStep );
availableScanNames = securityTest.getAvailableSecurityScanNames( testStep, availableScanNames );
if( availableScanNames == null || availableScanNames.length == 0 )
{
UISupport.showErrorMessage( "No security scans available for this test step" );
return;
}
String name = UISupport.prompt( "Specify type of security scan", "Add SecurityScan", availableScanNames );
if( name == null || name.trim().length() == 0 )
return;
String type = SoapUI.getSoapUICore().getSecurityScanRegistry().getSecurityScanTypeForName( name );
if( type == null || type.trim().length() == 0 )
return;
SecurityScan securityScan = securityTest.addNewSecurityScan( testStep, name );
if( securityScan == null )
{
UISupport.showErrorMessage( "Failed to add security scan" );
return;
}
securityScan.setRunOnlyOnce( true );
securityTestTree.setSelectionPath( new TreePath( node.getPath() ) );
SecurityConfigurationDialog dialog = SoapUI.getSoapUICore().getSecurityScanRegistry().getUIBuilder()
.buildSecurityScanConfigurationDialog( ( SecurityScan )securityScan );
if( !dialog.configure() )
{
SecurityScanNode securityScanNode = ( SecurityScanNode )node.getLastChild();
securityTest.removeSecurityScan( testStep, ( SecurityScan )securityScan );
cellRender.remove( securityScanNode );
}
dialog.release();
}
}
public class EnableDisableSecurityScan extends AbstractAction
{
EnableDisableSecurityScan()
{
super( "Enable Scan" );
putValue( Action.SHORT_DESCRIPTION, "Enables/Disables Security Scan" );
}
@Override
public void actionPerformed( ActionEvent arg0 )
{
SecurityScanNode node = ( SecurityScanNode )securityTestTree.getLastSelectedPathComponent();
SecurityScan securityScan = node.getSecurityScan();
securityScan.setDisabled( !securityScan.isDisabled() );
}
public void setText( boolean disabled )
{
if( disabled )
this.putValue( Action.NAME, "Enable Security Scan" );
else
this.putValue( Action.NAME, "Disable Security Scan" );
}
}
public class ConfigureSecurityScanAction extends AbstractAction
{
ConfigureSecurityScanAction()
{
super( "Configure" );
putValue( Action.SHORT_DESCRIPTION, "Configures selected security scan" );
putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/options.gif" ) );
setEnabled( false );
}
public void actionPerformed( ActionEvent e )
{
SecurityScanNode node = ( SecurityScanNode )securityTestTree.getLastSelectedPathComponent();
SecurityScan securityScan = node.getSecurityScan();
if( securityScan.isConfigurable() )
{
SecurityScanConfig backupScanConfig = ( SecurityScanConfig )securityScan.getConfig().copy();
SecurityConfigurationDialog dialog = SoapUI.getSoapUICore().getSecurityScanRegistry().getUIBuilder()
.buildSecurityScanConfigurationDialog( ( SecurityScan )securityScan );
if( !dialog.configure() )
{
securityScan.copyConfig( backupScanConfig );
}
dialog.release();
}
}
}
public class RemoveSecurityScanAction extends AbstractAction
{
public RemoveSecurityScanAction()
{
super( "Remove SecurityScan" );
putValue( Action.SHORT_DESCRIPTION, "Removes the selected security scan" );
putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/remove_security_scan.gif" ) );
setEnabled( false );
}
public void actionPerformed( ActionEvent e )
{
if( securityTest.isRunning() )
{
UISupport.showErrorMessage( "Can not delete SecurityScan while the SecurityTest is running" );
return;
}
if( securityTestTree.getSelectionCount() == 1 )
{
SecurityScanNode node = ( SecurityScanNode )securityTestTree.getLastSelectedPathComponent();
SecurityScan securityScan = node.getSecurityScan();
TestStep testStep = ( ( TestStepNode )node.getParent() ).getTestStep();
if( UISupport.confirm( "Remove security scan [" + securityScan.getName() + "]", "Remove SecurityScan" ) )
{
securityTest.removeSecurityScan( testStep, ( SecurityScan )securityScan );
}
}
else
{
SecurityScanNode node = ( SecurityScanNode )securityTestTree.getLastSelectedPathComponent();
TestStep testStep = ( ( TestStepNode )node.getParent() ).getTestStep();
if( UISupport.confirm( "Remove all selected security scans", "Remove SecurityScan" ) )
{
for( TreePath path : securityTestTree.getSelectionPaths() )
if( path.getLastPathComponent() instanceof SecurityScanNode )
{
SecurityScan securityScan = ( ( SecurityScanNode )path.getLastPathComponent() ).getSecurityScan();
securityTest.removeSecurityScan( testStep, ( SecurityScan )securityScan );
}
}
}
}
}
public class EnableSecurityScans extends AbstractAction
{
EnableSecurityScans()
{
super( "Enable Scans" );
}
@Override
public void actionPerformed( ActionEvent arg0 )
{
for( TreePath path : securityTestTree.getSelectionPaths() )
if( path.getLastPathComponent() instanceof SecurityScanNode )
( ( SecurityScanNode )path.getLastPathComponent() ).getSecurityScan().setDisabled( false );
}
}
public class DisableSecurityScans extends AbstractAction
{
public DisableSecurityScans()
{
super( "Disable Scans" );
}
@Override
public void actionPerformed( ActionEvent e )
{
for( TreePath path : securityTestTree.getSelectionPaths() )
if( path.getLastPathComponent() instanceof SecurityScanNode )
( ( SecurityScanNode )path.getLastPathComponent() ).getSecurityScan().setDisabled( true );
}
}
public class ExpandTreeAction extends AbstractAction
{
public ExpandTreeAction()
{
super( "Expand Tree" );
putValue( Action.SHORT_DESCRIPTION, "Expand Tree" );
}
public void actionPerformed( ActionEvent e )
{
for( int row = 0; row < securityTestTree.getRowCount(); row++ )
{
securityTestTree.expandRow( row );
}
}
}
public class CollapsTreeAction extends AbstractAction
{
public CollapsTreeAction()
{
super( "Collaps Tree" );
putValue( Action.SHORT_DESCRIPTION, "Collaps Tree" );
}
public void actionPerformed( ActionEvent e )
{
for( int row = securityTestTree.getRowCount() - 1; row >= 0; row-- )
{
securityTestTree.collapseRow( row );
}
}
}
public class InternalSecurityTestRunListener extends SecurityTestRunListenerAdapter
{
@Override
public void beforeSecurityScan( TestCaseRunner testRunner, SecurityTestRunContext runContext,
SecurityScan securityScan )
{
securityTestTree.setSelectionRow( securityTestTree.getRowForPath( new TreePath( treeModel.getSecurityScanNode(
securityScan ).getPath() ) ) );
}
@Override
public void beforeRun( TestCaseRunner testRunner, SecurityTestRunContext runContext )
{
disableAllActions();
}
@Override
public void afterRun( TestCaseRunner testRunner, SecurityTestRunContext runContext )
{
enableActionsAfterRun();
}
}
// tree selection
@Override
public void valueChanged( TreeSelectionEvent e )
{
enableActionsAfterRun();
}
/**
*
*/
protected void enableActionsAfterRun()
{
DefaultMutableTreeNode node = ( DefaultMutableTreeNode )securityTestTree.getLastSelectedPathComponent();
/* if nothing is selected */
if( node == null )
return;
if( node instanceof TestStepNode )
{
enableTestStepActions( node );
}
else if( node instanceof SecurityScanNode )
{
enableSecurityScanActions();
}
}
protected void enableSecurityScanActions()
{
if( securityTest.isRunning() )
return;
securityTestLog.locateSecurityScan( ( ( SecurityScanNode )securityTestTree.getLastSelectedPathComponent() )
.getSecurityScan() );
addSecurityScanAction.setEnabled( false );
configureSecurityScanAction.setEnabled( true );
removeSecurityScanAction.setEnabled( true );
if( ( ( SecurityScanNode )securityTestTree.getLastSelectedPathComponent() ).getSecurityScan() instanceof AbstractSecurityScanWithProperties )
{
cloneParametersAction.setEnabled( true );
cloneParametersAction
.setSecurityScan( ( AbstractSecurityScanWithProperties )( ( SecurityScanNode )securityTestTree
.getLastSelectedPathComponent() ).getSecurityScan() );
}
}
protected void enableTestStepActions( DefaultMutableTreeNode node )
{
if( securityTest.isRunning() )
return;
if( node.getAllowsChildren() )
addSecurityScanAction.setEnabled( true );
else
addSecurityScanAction.setEnabled( false );
configureSecurityScanAction.setEnabled( false );
removeSecurityScanAction.setEnabled( false );
cloneParametersAction.setEnabled( false );
}
@Override
public void mouseClicked( MouseEvent e )
{
DefaultMutableTreeNode node = ( DefaultMutableTreeNode )securityTestTree.getLastSelectedPathComponent();
if( node == null )
return;
if( ( e.getModifiers() & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK )
return;
/* if nothing is selected */
if( e.getClickCount() == 1 )
{
if( securityTestTree.isExpanded( TreePathUtils.getPath( node ) ) && node instanceof TestStepNode
&& cellRender.isOn( ( TestStepNode )node, e.getX(), e.getY() ) )
{
securityTestTree.collapseRow( securityTestTree.getRowForLocation( e.getX(), e.getY() ) );
}
else
{
securityTestTree.expandRow( securityTestTree.getRowForLocation( e.getX(), e.getY() ) );
}
e.consume();
return;
}
if( node instanceof SecurityScanNode )
{
if( securityTest.isRunning() )
return;
SecurityScan securityScan = ( ( SecurityScanNode )securityTestTree.getLastSelectedPathComponent() )
.getSecurityScan();
if( securityScan.isConfigurable() )
{
SecurityScanConfig backupScanConfig = ( SecurityScanConfig )securityScan.getConfig().copy();
SecurityConfigurationDialog dialog = SoapUI.getSoapUICore().getSecurityScanRegistry().getUIBuilder()
.buildSecurityScanConfigurationDialog( ( SecurityScan )securityScan );
if( !dialog.configure() )
{
securityScan.copyConfig( backupScanConfig );
}
dialog.release();
}
}
else
{
if( securityTestTree.isExpanded( TreePathUtils.getPath( node ) ) )
{
UISupport.selectAndShow( ( ( TestStepNode )node ).getTestStep() );
e.consume();
}
}
}
@Override
public void mouseEntered( MouseEvent e )
{
// TODO
}
@Override
public void mouseExited( MouseEvent e )
{
// TODO Auto-generated method stub
}
@Override
public void mousePressed( MouseEvent e )
{
}
@Override
public void mouseReleased( MouseEvent e )
{
if( securityTest.isRunning() )
return;
TreePath path = securityTestTree.getPathForLocation( e.getX(), e.getY() );
if( ( e.getModifiers() & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK
&& ( securityTestTree.getSelectionRows().length <= 1 || multypopupvisible ) )
{
securityTestTree.setSelectionPath( path );
multypopupvisible = false;
}
Object node = securityTestTree.getLastSelectedPathComponent();
if( node == null )
return;
if( ( e.getModifiers() & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK )
{
if( node instanceof SecurityScanNode )
{
// one selected
if( securityTestTree.getSelectionRows().length == 1 )
{
SecurityScan scan = ( ( SecurityScanNode )node ).getSecurityScan();
enableDisableSecurityScan.setText( scan.isDisabled() );
if( scan instanceof AbstractSecurityScanWithProperties )
securityScanWithPropertiesPopUp.show( securityTestTree, e.getX(), e.getY() );
else
securityScanPopUp.show( securityTestTree, e.getX(), e.getY() );
}
else if( securityTestTree.getSelectionRows().length > 1 )
{
// check if selected are all enabled/disabled
populateMultySecurityScanPopup( true, true );
boolean hasEnabledScans = false;
boolean hasDisabledScans = false;
for( TreePath path2 : securityTestTree.getSelectionPaths() )
{
if( path2.getLastPathComponent() instanceof SecurityScanNode )
{
if( ( ( SecurityScanNode )path2.getLastPathComponent() ).getSecurityScan().isDisabled() )
{
hasDisabledScans = true;
}
else
{
hasEnabledScans = true;
}
}
}
if( hasEnabledScans && !hasDisabledScans )
{
populateMultySecurityScanPopup( false, true );
}
else if( !hasEnabledScans && hasDisabledScans )
{
populateMultySecurityScanPopup( true, false );
}
multySecurityScanPopUp.show( securityTestTree, e.getX(), e.getY() );
}
}
else if( ( ( TestStepNode )node ).getTestStep() instanceof Securable )
{
testStepPopUp.show( securityTestTree, e.getX(), e.getY() );
}
}
}
public class CustomTreeUI extends BasicTreeUI
{
public CustomTreeUI()
{
super();
leftChildIndent = 0;
rightChildIndent = 0;
totalChildIndent = 0;
}
@Override
public int getLeftChildIndent()
{
return 0;
}
@Override
protected void installListeners()
{
super.installListeners();
tree.addComponentListener( componentListener );
}
@Override
protected void uninstallListeners()
{
tree.removeComponentListener( componentListener );
super.uninstallListeners();
}
@Override
protected AbstractLayoutCache.NodeDimensions createNodeDimensions()
{
return new NodeDimensionsHandler()
{
@Override
public Rectangle getNodeDimensions( Object value, int row, int depth, boolean expanded, Rectangle size )
{
Rectangle dimensions = super.getNodeDimensions( value, row, depth, expanded, size );
Insets insets = tree.getInsets();
if( scrollPane == null )
dimensions.width = tree.getWidth() - getRowX( row, depth ) - insets.right;
else
{
dimensions.width = scrollPane.getViewport().getWidth() - getRowX( row, depth ) - insets.right;
}
return dimensions;
}
};
}
private final ComponentListener componentListener = new ComponentAdapter()
{
@Override
public void componentResized( ComponentEvent e )
{
treeState.invalidateSizes();
tree.repaint();
};
};
protected void paintRow( Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, TreePath path,
int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf )
{
super.paintRow( g, clipBounds, insets, new Rectangle( 0, bounds.y, bounds.width + bounds.x, bounds.height ),
path, row, isExpanded, hasBeenExpanded, isLeaf );
};
@Override
protected void paintHorizontalPartOfLeg( Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds,
TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf )
{
};
@Override
protected void paintVerticalPartOfLeg( Graphics g, Rectangle clipBounds, Insets insets, TreePath path )
{
// TODO Auto-generated method stub
// super.paintVerticalPartOfLeg( g, clipBounds, insets, path );
}
}
public void release()
{
cellRender.release();
securityTest.getTestCase().getTestSuite().removeTestSuiteListener( testSuiteListener );
securityTest.removeSecurityTestListener( this );
securityTest.removeSecurityTestRunListener( testRunListener );
if( treeModel != null )
{
treeModel.release();
}
}
@Override
public void securityScanAdded( SecurityScan securityScan )
{
treeModel.addSecurityScanNode( securityTestTree, securityScan );
}
@Override
public void securityScanRemoved( SecurityScan securityScan )
{
cellRender.remove( treeModel.getSecurityScanNode( securityScan ) );
treeModel.removeSecurityScanNode( securityScan );
}
/**
*
*/
protected void disableAllActions()
{
addSecurityScanAction.setEnabled( false );
configureSecurityScanAction.setEnabled( false );
removeSecurityScanAction.setEnabled( false );
cloneParametersAction.setEnabled( false );
}
}