/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* 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.extension.httppanel.view.syntaxhighlight.menus;
import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JViewport;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;
import org.fife.ui.rtextarea.RTextScrollPane;
import org.parosproxy.paros.Constant;
import org.zaproxy.zap.extension.ExtensionPopupMenu;
import org.zaproxy.zap.extension.httppanel.view.syntaxhighlight.HttpPanelSyntaxHighlightTextArea;
public class ViewMenu extends ExtensionPopupMenu {
private static final long serialVersionUID = -6295434374221271825L;
private static final String MENU_LABEL = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.label");
private static final String ANTI_ALIASING = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.antiAliasing");
private static final String SHOW_LINE_NUMBERS = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.showLineNumbers");
private static final String WORD_WRAP = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.wordWrap");
private static final String HIGHLIGHT_CURRENT_LINE = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.highlightCurrentLine");
private static final String FADE_CURRENT_HIGHLIGHT_LINE = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.fadeCurrentHighlightLine");
private static final String SHOW_WHITESPACE_CHARACTERS = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.showWhitespaceCharacters");
private static final String SHOW_NEWLINE_CHARACTERS = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.showNewlineCharacters");
private static final String MARK_OCCURRENCES = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.markOccurrences");
private static final String ROUNDED_SELECTION_EDGES = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.roundedSelectionEdges");
private static final String BRACKET_MATCHING = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.bracketMatching");
private static final String ANIMATED_BRACKET_MATCHING = Constant.messages.getString("http.panel.view.syntaxtext.popup.view.animatedBracketMatching");
private JCheckBoxMenuItem antiAliasingOption;
private JCheckBoxMenuItem lineNumbersOption;
private JCheckBoxMenuItem wordWrapOption;
private JCheckBoxMenuItem highlightCurrentLineOption;
private JCheckBoxMenuItem fadeCurrentHighlightLineOption;
private JCheckBoxMenuItem showWhitespacesOption;
private JCheckBoxMenuItem showNewlinesOption;
private JCheckBoxMenuItem markOccurrencesOption;
private JCheckBoxMenuItem roundedSelectionEdgesOption;
private JCheckBoxMenuItem bracketMatchingOption;
private JCheckBoxMenuItem animatedBracketMatchingOption;
public ViewMenu() {
super(MENU_LABEL);
antiAliasingOption = createAndAddOption(new ChangeAntiAliasingAction(ANTI_ALIASING), this);
lineNumbersOption = createAndAddOption(new ChangeLineNumbersAction(SHOW_LINE_NUMBERS), this);
wordWrapOption = createAndAddOption(new ChangeWordWrapAction(WORD_WRAP), this);
addSeparator();
highlightCurrentLineOption = createAndAddOption(new ChangeHighlightCurrentLineAction(HIGHLIGHT_CURRENT_LINE), this);
fadeCurrentHighlightLineOption = createAndAddOption(new ChangeFadeCurrentHighlightLineAction(FADE_CURRENT_HIGHLIGHT_LINE), this);
addSeparator();
showWhitespacesOption = createAndAddOption(new ChangeShowWhitespacesAction(SHOW_WHITESPACE_CHARACTERS), this);
showNewlinesOption = createAndAddOption(new ChangeShowNewlinesAction(SHOW_NEWLINE_CHARACTERS), this);
addSeparator();
markOccurrencesOption = createAndAddOption(new ChangeMarkOccurrencesAction(MARK_OCCURRENCES), this);
addSeparator();
roundedSelectionEdgesOption = createAndAddOption(new ChangeRoundedSelectionEdgesAction(ROUNDED_SELECTION_EDGES), this);
addSeparator();
bracketMatchingOption = createAndAddOption(new ChangeBracketMatchingAction(BRACKET_MATCHING), this);
animatedBracketMatchingOption = createAndAddOption(new ChangeAnimatedBracketMatchingAction(ANIMATED_BRACKET_MATCHING), this);
}
@Override
public boolean isEnableForComponent(Component invoker) {
if (invoker instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)invoker;
updateState(httpPanelTextArea);
return true;
}
return false;
}
public void updateState(HttpPanelSyntaxHighlightTextArea httpPanelTextArea) {
antiAliasingOption.setSelected(httpPanelTextArea.getAntiAliasingEnabled());
boolean selected = false;
boolean enabled = false;
Component c = httpPanelTextArea.getParent();
if (c instanceof JViewport) {
c = c.getParent();
if (c instanceof RTextScrollPane) {
enabled = true;
final RTextScrollPane scrollPane = (RTextScrollPane)c;
selected = scrollPane.getLineNumbersEnabled();
}
}
lineNumbersOption.setVisible(enabled);
lineNumbersOption.setSelected(selected);
wordWrapOption.setSelected(httpPanelTextArea.getLineWrap());
highlightCurrentLineOption.setSelected(httpPanelTextArea.getHighlightCurrentLine());
fadeCurrentHighlightLineOption.setSelected(httpPanelTextArea.getFadeCurrentLineHighlight());
showWhitespacesOption.setSelected(httpPanelTextArea.isWhitespaceVisible());
showNewlinesOption.setSelected(httpPanelTextArea.getEOLMarkersVisible());
markOccurrencesOption.setSelected(httpPanelTextArea.getMarkOccurrences());
roundedSelectionEdgesOption.setSelected(httpPanelTextArea.getRoundedSelectionEdges());
bracketMatchingOption.setSelected(httpPanelTextArea.isBracketMatchingEnabled());
animatedBracketMatchingOption.setSelected(httpPanelTextArea.getAnimateBracketMatching());
}
private JCheckBoxMenuItem createAndAddOption(TextAction action, JMenu menu) {
JCheckBoxMenuItem option = new JCheckBoxMenuItem(action);
option.setSelected(false);
menu.add(option);
return option;
}
private static class ChangeAntiAliasingAction extends TextAction {
private static final long serialVersionUID = 5408392183841188837L;
public ChangeAntiAliasingAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setAntiAliasingEnabled(!httpPanelTextArea.getAntiAliasingEnabled());
}
}
}
private static class ChangeLineNumbersAction extends TextAction {
private static final long serialVersionUID = 7253500343033234417L;
public ChangeLineNumbersAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
Component c = httpPanelTextArea.getParent();
if (c instanceof JViewport) {
c = c.getParent();
if (c instanceof RTextScrollPane) {
final RTextScrollPane scrollPane = (RTextScrollPane)c;
scrollPane.setLineNumbersEnabled(!scrollPane.getLineNumbersEnabled());
}
}
}
}
}
private static class ChangeWordWrapAction extends TextAction {
private static final long serialVersionUID = -8654200226170189435L;
public ChangeWordWrapAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setLineWrap(!httpPanelTextArea.getLineWrap());
}
}
}
private static class ChangeHighlightCurrentLineAction extends TextAction {
private static final long serialVersionUID = -1464472023983865781L;
public ChangeHighlightCurrentLineAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setHighlightCurrentLine(!httpPanelTextArea.getHighlightCurrentLine());
}
}
}
private static class ChangeFadeCurrentHighlightLineAction extends TextAction {
private static final long serialVersionUID = -1430399597611245037L;
public ChangeFadeCurrentHighlightLineAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setFadeCurrentLineHighlight(!httpPanelTextArea.getFadeCurrentLineHighlight());
}
}
}
private static class ChangeShowWhitespacesAction extends TextAction {
private static final long serialVersionUID = 1658351146973083837L;
public ChangeShowWhitespacesAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setWhitespaceVisible(!httpPanelTextArea.isWhitespaceVisible());
}
}
}
private static class ChangeShowNewlinesAction extends TextAction {
private static final long serialVersionUID = -4769295127472728093L;
public ChangeShowNewlinesAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setEOLMarkersVisible(!httpPanelTextArea.getEOLMarkersVisible());
}
}
}
private static class ChangeMarkOccurrencesAction extends TextAction {
private static final long serialVersionUID = 4264667901630036382L;
public ChangeMarkOccurrencesAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setMarkOccurrences(!httpPanelTextArea.getMarkOccurrences());
}
}
}
private static class ChangeRoundedSelectionEdgesAction extends TextAction {
private static final long serialVersionUID = 6117454234529550001L;
public ChangeRoundedSelectionEdgesAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setRoundedSelectionEdges(!httpPanelTextArea.getRoundedSelectionEdges());
}
}
}
private static class ChangeBracketMatchingAction extends TextAction {
private static final long serialVersionUID = 7913147909802331579L;
public ChangeBracketMatchingAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setBracketMatchingEnabled(!httpPanelTextArea.isBracketMatchingEnabled());
}
}
}
private static class ChangeAnimatedBracketMatchingAction extends TextAction {
private static final long serialVersionUID = -4394901099442863189L;
public ChangeAnimatedBracketMatchingAction(String text) {
super(text);
}
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
if (textComponent instanceof HttpPanelSyntaxHighlightTextArea) {
HttpPanelSyntaxHighlightTextArea httpPanelTextArea = (HttpPanelSyntaxHighlightTextArea)textComponent;
httpPanelTextArea.setAnimateBracketMatching(!httpPanelTextArea.getAnimateBracketMatching());
}
}
}
}