/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.security.panels;
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;
import org.jdesktop.swingx.JXTree;
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 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;
/**
* 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("/preferences.png"));
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);
}
}