All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zaproxy.zap.view.popup.PopupMenuUtils Maven / Gradle / Ivy

Go to download

The Zed Attack Proxy (ZAP) is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications. It is designed to be used by people with a wide range of security experience and as such is ideal for developers and functional testers who are new to penetration testing. ZAP provides automated scanners as well as a set of tools that allow you to find security vulnerabilities manually.

There is a newer version: 2.15.0
Show newest version
/*
 * Zed Attack Proxy (ZAP) and its related class files.
 *
 * ZAP is an HTTP/HTTPS proxy for assessing web application security.
 *
 * Copyright 2014 The ZAP Development Team
 *
 * Licensed 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.zaproxy.zap.view.popup;

import java.awt.Component;
import java.awt.Container;
import javax.swing.JMenu;
import javax.swing.JPopupMenu;
import javax.swing.MenuElement;
import org.parosproxy.paros.extension.ExtensionPopupMenuItem;
import org.zaproxy.zap.extension.ExtensionPopupMenu;
import org.zaproxy.zap.view.messagecontainer.MessageContainer;

/**
 * A helper class with common utility methods for pop up menus ({@code JPopupMenu}) and its related
 * classes ({@code JMenu}s, {@code JMenuItem}s, {@code ExtensionPopupMenu}s, {@code
 * ExtensionPopupMenuItem}s).
 *
 * @since 2.3.0
 * @see JPopupMenu
 * @see JMenu
 * @see ExtensionPopupMenu
 * @see ExtensionPopupMenuItem
 */
public final class PopupMenuUtils {

    private PopupMenuUtils() {}

    /**
     * Tells whether or not the given {@code component} has at least one child component visible.
     *
     * @param component the component that will be checked
     * @return {@code true} if at least one child component is visible, {@code false} otherwise.
     */
    public static boolean isAtLeastOneChildComponentVisible(Container component) {
        for (Component comp : component.getComponents()) {
            if (comp.isVisible()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Convenience method that calls the method {@code isAtLeastOneChildComponentVisible(Container)}
     * with the {@code JPopupMenu} of the given {@code menu} as parameter.
     *
     * @param menu the menu that will be checked
     * @return {@code true} if at least one child component is visible, {@code false} otherwise.
     * @see #isAtLeastOneChildComponentVisible(Container)
     * @see JMenu
     */
    public static boolean isAtLeastOneChildComponentVisible(JMenu menu) {
        return isAtLeastOneChildComponentVisible(menu.getPopupMenu());
    }

    /**
     * Tells whether or not the given {@code component} is an {@code ExtensionPopupMenuItem}.
     *
     * @param component the component that will be checked.
     * @return {@code true} if the given component is an {@code ExtensionPopupMenuItem}, {@code
     *     false} otherwise.
     * @see ExtensionPopupMenuItem
     * @see #isExtensionPopupMenu(Component)
     * @see #isPopupMenuSeparator(Component)
     */
    public static boolean isExtensionPopupMenuItem(Component component) {
        return (component instanceof ExtensionPopupMenuItem);
    }

    /**
     * Tells whether or not the given {@code component} is an {@code ExtensionPopupMenu}.
     *
     * @param component the component that will be checked.
     * @return {@code true} if the given component is an {@code ExtensionPopupMenu}, {@code false}
     *     otherwise.
     * @see ExtensionPopupMenu
     * @see #isExtensionPopupMenuItem(Component)
     * @see #isPopupMenuSeparator(Component)
     */
    public static boolean isExtensionPopupMenu(Component component) {
        return (component instanceof ExtensionPopupMenu);
    }

    /**
     * Tells whether or not the given {@code component} is an {@code ExtensionPopupMenuComponent}.
     *
     * @param component the component that will be checked.
     * @return {@code true} if the given component is an {@code ExtensionPopupMenuComponent}, {@code
     *     false} otherwise.
     * @see ExtensionPopupMenuComponent
     */
    public static boolean isExtensionPopupMenuComponent(Component component) {
        return (component instanceof ExtensionPopupMenuComponent);
    }

    /**
     * Tells whether or not the given {@code menuElement} is an {@code ExtensionPopupMenuComponent}.
     *
     * @param menuElement the menu element that will be checked.
     * @return {@code true} if the given menu element is an {@code ExtensionPopupMenuComponent},
     *     {@code false} otherwise.
     * @since 2.4.0
     * @see ExtensionPopupMenuComponent
     */
    public static boolean isExtensionPopupMenuComponent(MenuElement menuElement) {
        return (menuElement instanceof ExtensionPopupMenuComponent);
    }

    /**
     * Tells whether or not the given {@code component} is a {@code JPopupMenu.Separator}.
     *
     * @param component the component that will be checked.
     * @return {@code true} if the given component is a {@code JPopupMenu.Separator}, {@code false}
     *     otherwise.
     * @see javax.swing.JPopupMenu.Separator
     * @see #isExtensionPopupMenu(Component)
     * @see #isExtensionPopupMenuItem(Component)
     */
    public static boolean isPopupMenuSeparator(Component component) {
        return (component instanceof JPopupMenu.Separator);
    }

    /**
     * Removes all separators from the given pop up menu.
     *
     * @param popupMenu the pop up menu whose separators will be removed
     * @see javax.swing.JPopupMenu.Separator
     */
    public static void removeAllSeparators(JPopupMenu popupMenu) {
        for (int i = 0; i < popupMenu.getComponentCount(); i++) {
            if (isPopupMenuSeparator(popupMenu.getComponent(i))) {
                popupMenu.remove(i);
                i--;
            }
        }
    }

    /**
     * Convenience method that calls the method {@code removeAllSeparators(JPopupMenu)} with the
     * {@code JPopupMenu} of the given {@code menu} as parameter.
     *
     * @param menu the menu whose separators will be removed
     * @see #removeAllSeparators(JPopupMenu)
     * @see JMenu#getPopupMenu()
     * @see javax.swing.JPopupMenu.Separator
     */
    public static void removeAllSeparators(JMenu menu) {
        removeAllSeparators(menu.getPopupMenu());
    }

    /**
     * Removes all consecutive separators from the given menu.
     *
     * 

For example, calling the method on the given menu: * *

     *    Menu Entry
     *    Separator
     *    Menu Entry
     *    Separator
     *    Separator
     *    Menu Entry
     * 
* * would result in: * *
     *    Menu Entry
     *    Separator
     *    Menu Entry
     *    Separator
     *    Menu Entry
     * 
* * @param popupMenu the pop up menu whose consecutive separators will be removed * @see javax.swing.JPopupMenu.Separator */ public static void removeConsecutiveSeparators(JPopupMenu popupMenu) { for (int i = 1; i < popupMenu.getComponentCount(); i++) { if (isPopupMenuSeparator(popupMenu.getComponent(i))) { if (isPopupMenuSeparator(popupMenu.getComponent(i - 1))) { popupMenu.remove(i); i--; } } } } /** * Convenience method that calls the method {@code removeConsecutiveSeparators(JPopupMenu)} with * the {@code JPopupMenu} of the given {@code menu} as parameter. * * @param menu the menu whose consecutive separators will be removed * @see #removeConsecutiveSeparators(JPopupMenu) * @see JMenu#getPopupMenu() * @see javax.swing.JPopupMenu.Separator */ public static void removeConsecutiveSeparators(JMenu menu) { removeConsecutiveSeparators(menu.getPopupMenu()); } /** * Removes all top separators from the given pop up menu. * *

For example, calling the method on the given menu: * *

     *    Separator
     *    Separator
     *    Menu Entry
     *    Separator
     *    Menu Entry
     *    Separator
     *    Menu Entry
     * 
* * would result in: * *
     *    Menu Entry
     *    Separator
     *    Menu Entry
     *    Separator
     *    Menu Entry
     * 
* * @param popupMenu the pop up menu whose top separators will be removed * @see javax.swing.JPopupMenu.Separator */ public static void removeTopSeparators(JPopupMenu popupMenu) { while (popupMenu.getComponentCount() > 0 && isPopupMenuSeparator(popupMenu.getComponent(0))) { popupMenu.remove(0); } } /** * Convenience method that calls the method {@code removeTopSeparators(JPopupMenu)} with the * {@code JPopupMenu} of the given {@code menu} as parameter. * * @param menu the menu whose top separators will be removed * @see #removeTopSeparators(JPopupMenu) * @see JMenu#getPopupMenu() * @see javax.swing.JPopupMenu.Separator */ public static void removeTopSeparators(JMenu menu) { removeTopSeparators(menu.getPopupMenu()); } /** * Removes all bottom separators from the given pop up menu. * *

For example, calling the method on the given menu: * *

     *    Menu Entry
     *    Separator
     *    Menu Entry
     *    Separator
     *    Menu Entry
     *    Separator
     *    Separator
     * 
* * would result in: * *
     *    Menu Entry
     *    Separator
     *    Menu Entry
     *    Separator
     *    Menu Entry
     * 
* * @param popupMenu the pop up menu whose bottom separators will be removed * @see javax.swing.JPopupMenu.Separator */ public static void removeBottomSeparators(JPopupMenu popupMenu) { int indexLastComponent = popupMenu.getComponentCount() - 1; while (indexLastComponent >= 0 && isPopupMenuSeparator(popupMenu.getComponent(indexLastComponent))) { popupMenu.remove(indexLastComponent); indexLastComponent -= 1; } } /** * Convenience method that calls the method {@code removeBottomSeparators(JPopupMenu)} with the * {@code JPopupMenu} of the given {@code menu} as parameter. * * @param menu the menu whose bottom separators will be removed * @see #removeBottomSeparators(JPopupMenu) * @see JMenu#getPopupMenu() * @see javax.swing.JPopupMenu.Separator */ public static void removeBottomSeparators(JMenu menu) { removeBottomSeparators(menu.getPopupMenu()); } /** * Convenience method that calls the methods {@code removeTopSeparators(JPopupMenu)} and {@code * removeBottomSeparators(JPopupMenu)} with the given pop up menu as parameter. * * @param popupMenu the pop up menu whose top and bottom separators will be removed * @see #removeTopSeparators(JPopupMenu) * @see #removeBottomSeparators(JPopupMenu) * @see javax.swing.JPopupMenu.Separator */ public static void removeTopAndBottomSeparators(JPopupMenu popupMenu) { if (popupMenu.getComponentCount() == 0) { return; } removeTopSeparators(popupMenu); removeBottomSeparators(popupMenu); } /** * Convenience method that calls the method {@code removeTopAndBottomSeparators(JPopupMenu)} * with the {@code JPopupMenu} of the given {@code menu} as parameter. * * @param menu the menu whose top and bottom separators will be removed * @see #removeTopAndBottomSeparators(JPopupMenu) * @see JMenu#getPopupMenu() * @see javax.swing.JPopupMenu.Separator */ public static void removeTopAndBottomSeparators(JMenu menu) { removeTopAndBottomSeparators(menu.getPopupMenu()); } /** * Appends a separator to the end of the menu if it exists at least one non separator menu * component immediately before and if there isn't, already, a separator at the end of the menu. * * @param popupMenu the pop up menu that will be processed * @return {@code true} if the separator was added, {@code false} otherwise. * @see javax.swing.JPopupMenu.Separator */ public static boolean addSeparatorIfNeeded(JPopupMenu popupMenu) { final int menuComponentCount = popupMenu.getComponentCount(); if (menuComponentCount == 0) { return false; } final Component lastMenuComponent = popupMenu.getComponent(menuComponentCount - 1); if (isPopupMenuSeparator(lastMenuComponent)) { return false; } popupMenu.addSeparator(); return true; } /** * Convenience method that calls the method {@code addSeparatorIfNeeded(JPopupMenu)} with the * {@code JPopupMenu} of the given {@code menu} as parameter. * * @param menu the menu that will be processed * @return {@code true} if the separator was added, {@code false} otherwise. * @see #addSeparatorIfNeeded(JPopupMenu) * @see JMenu#getPopupMenu() * @see javax.swing.JPopupMenu.Separator */ public static boolean addSeparatorIfNeeded(JMenu menu) { return addSeparatorIfNeeded(menu.getPopupMenu()); } /** * Inserts a separator at the given {@code position} if it exists a non separator menu component * at the given {@code position} and if there isn't, already, a separator immediately before the * insert {@code position} (to prevent consecutive separators). * * @param popupMenu the pop up menu that will be processed * @param position the position where a separator might be inserted * @return {@code true} if the separator was inserted, {@code false} otherwise. * @see javax.swing.JPopupMenu.Separator */ public static boolean insertSeparatorIfNeeded(JPopupMenu popupMenu, int position) { final int menuComponentCount = popupMenu.getComponentCount(); if (menuComponentCount == 0 || position <= 0 || position > menuComponentCount) { return false; } final Component currentComponent = popupMenu.getComponent(position); if (isPopupMenuSeparator(currentComponent)) { return false; } final Component previousComponent = popupMenu.getComponent(position - 1); if (isPopupMenuSeparator(previousComponent)) { return false; } popupMenu.insert(new JPopupMenu.Separator(), position); return true; } /** * Convenience method that calls the method {@code insertSeparatorIfNeeded(JPopupMenu,int)} with * the {@code JPopupMenu} of the given {@code menu} as the first parameter and with the given * {@code position} as second parameter. * * @param menu the menu that will be processed * @param position the position where a separator might be inserted * @return {@code true} if the separator was inserted, {@code false} otherwise. * @see #insertSeparatorIfNeeded(JPopupMenu,int) * @see JMenu#getPopupMenu() * @see javax.swing.JPopupMenu.Separator */ public static boolean insertSeparatorIfNeeded(JMenu menu, int position) { return insertSeparatorIfNeeded(menu.getPopupMenu(), position); } /** * Returns the {@code component} wrapped in a {@code PopupMenuInvokerWrapper}. * * @param component the component that will be wrapped. * @return a {@code PopupMenuInvokerWrapper} wrapping the given {@code component}. * @see PopupMenuInvokerWrapper */ public static PopupMenuInvokerWrapper getPopupMenuInvokerWrapper(final Component component) { return new ComponentPopupMenuInvoker(component); } /** * Returns the {@code messageContainer} wrapped in a {@code PopupMenuInvokerWrapper}. * * @param messageContainer the message container that will be wrapped. * @return a {@code PopupMenuInvokerWrapper} wrapping the given {@code messageContainer}. * @see PopupMenuInvokerWrapper */ public static PopupMenuInvokerWrapper getPopupMenuInvokerWrapper( final MessageContainer messageContainer) { return new MessageContainerPopupMenuInvoker(messageContainer); } /** * An abstract class that allows to check if a {@code ExtensionPopupMenuComponent} is enable for * the contained wrapped object. * *

It allows to use the same object ({@code PopupMenuInvokerWrapper}) for both types {@code * Component} and {@code MessageContainer}, with {@code ComponentPopupMenuInvoker} and {@code * MessageContainerPopupMenuInvoker}, respectively. * * @see #isEnable(ExtensionPopupMenuComponent) * @see ComponentPopupMenuInvoker * @see MessageContainerPopupMenuInvoker */ public abstract static class PopupMenuInvokerWrapper { private final Component component; /** * Constructs a {@code PopupMenuInvokerWrapper} with the given {@code component} of the * wrapped object. * * @param component the component of the wrapped object. * @throws IllegalArgumentException if the given {@code component} is null */ public PopupMenuInvokerWrapper(final Component component) { if (component == null) { throw new IllegalArgumentException("Parameter component must not be null."); } this.component = component; } /** * Returns the {@code Component} of the wrapped object. * * @return the component of the wrapped object. */ public Component getComponent() { return component; } /** * Tells whether the given {@code menuComponent} is enable for the wrapped object. * * @param menuComponent the menu component that will be tested * @return {@code true} if the menu component is enable for this wrapped object, {@code * false} otherwise. */ public abstract boolean isEnable(ExtensionPopupMenuComponent menuComponent); } /** * A {@code PopupMenuInvokerWrapper} for {@code Component}s. * *

Calls the method {@code ExtensionPopupMenuComponent#isEnableForComponent(Component)}, with * the wrapped object as parameter. * * @see PopupMenuInvokerWrapper * @see MessageContainerPopupMenuInvoker * @see ExtensionPopupMenuComponent#isEnableForComponent(Component) */ public static class ComponentPopupMenuInvoker extends PopupMenuInvokerWrapper { /** * Constructs a {@code ComponentPopupMenuInvoker} with the given {@code component} as the * wrapped object. * * @param component the component that will be wrapped * @throws IllegalArgumentException if the given {@code component} is null */ public ComponentPopupMenuInvoker(Component component) { super(component); } @Override public boolean isEnable(ExtensionPopupMenuComponent menuComponent) { return menuComponent.isEnableForComponent(getComponent()); } } /** * A {@code PopupMenuInvokerWrapper} for {@code MessageContainer}s. * *

Calls the method {@code * ExtensionPopupMenuComponent#isEnableForMessageContainer(MessageContainer)}, with the wrapped * object as parameter. * * @see PopupMenuInvokerWrapper * @see ComponentPopupMenuInvoker * @see ExtensionPopupMenuComponent#isEnableForMessageContainer(MessageContainer) */ public static class MessageContainerPopupMenuInvoker extends PopupMenuInvokerWrapper { private final MessageContainer messageContainer; /** * Constructs a {@code MessageContainerPopupMenuInvoker} with the given {@code * messageContainer} as the wrapped object. * * @param messageContainer the message container that will be wrapped * @throws NullPointerException if the given {@code messageContainer} is null */ public MessageContainerPopupMenuInvoker(final MessageContainer messageContainer) { super(messageContainer.getComponent()); this.messageContainer = messageContainer; } @Override public boolean isEnable(ExtensionPopupMenuComponent menuComponent) { return menuComponent.isEnableForMessageContainer(messageContainer); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy