org.zaproxy.zap.view.popup.PopupMenuUtils Maven / Gradle / Ivy
Show all versions of zap Show documentation
/*
* 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);
}
}
}