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

org.parosproxy.paros.extension.option.OptionsParamView 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.

The newest version!
/*
 *
 * Paros and its related class files.
 *
 * Paros is an HTTP/HTTPS proxy for assessing web application security.
 * Copyright (C) 2003-2004 Chinotec Technologies Company
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the Clarified Artistic License
 * as published by the Free Software Foundation.
 *
 * This program 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
 * Clarified Artistic License for more details.
 *
 * You should have received a copy of the Clarified Artistic License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
// ZAP: 2011/06/02 Warn the first time the user double clicks on a tab
// ZAP: 2012/03/15 Removed the options of the http panels.
// ZAP: 2012/08/01 Issue 332: added support for Modes
// ZAP: 2013/01/25 Removed the "(non-Javadoc)" comments.
// ZAP: 2013/07/23 Issue 738: Options to hide tabs
// ZAP: 2013/12/13 Added support for optional names in tabs.
// ZAP: 2014/03/23 Issue 589: Move Reveal extension to ZAP extensions project
// ZAP: 2014/04/25 Issue 642: Add timestamps to Output tab(s)
// ZAP: 2014/10/07 Issue 1357: Hide unused tabs
// ZAP: 2014/10/09 Issue 1359: Options for splash screen
// ZAP: 2014/12/16 Issue 1466: Config option for 'large display' size
// ZAP: 2015/03/04 Added dev build warning option
// ZAP: 2016/04/04 Do not require a restart to show/hide the tool bar
// ZAP: 2016/04/06 Fix layouts' issues
// ZAP: 2016/04/27 Save, always, the Locale as String
// ZAP: 2016/05/13 Add options to confirm removal of exclude from proxy, scanner and spider regexes
// ZAP: 2017/05/29 Add option to use system's locale for formatting.
// ZAP: 2017/09/26 Use helper methods to read the configurations.
// ZAP: 2018/01/25 Remove unused constant LOCALES.
// ZAP: 2018/02/14 Remove unnecessary boxing / unboxing
// ZAP: 2018/02/27 Added support for selecting the look and feel.
// ZAP: 2018/06/11 Added options for Work Panels Font.
// ZAP: 2019/06/01 Normalise line endings.
// ZAP: 2019/06/05 Normalise format/style.
// ZAP: 2020/02/24 Persist the class of the selected look and feel.
// ZAP: 2020/09/29 Add support for dynamic Look and Feel switching (Issue 6201)
// ZAP: 2020/10/26 Update pop up menus when changing look and feel.
// ZAP: 2020/11/26 Use Log4j 2 classes for logging.
// ZAP: 2021/09/16 Add support for enabling app integration in containers
// ZAP: 2022/02/25 Deprecate options no longer in use.
// ZAP: 2022/02/26 Remove code deprecated in 2.5.0
// ZAP: 2022/04/28 Add set and get of the open recent menu
// ZAP: 2022/09/21 Use format specifiers instead of concatenation when logging.
// ZAP: 2023/01/10 Tidy up logger.
// ZAP: 2023/01/21 Add option to set icon size independently of font.
package org.parosproxy.paros.extension.option;

import java.awt.Window;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.common.AbstractParam;
import org.parosproxy.paros.control.Control.Mode;
import org.parosproxy.paros.extension.AbstractDialog;
import org.parosproxy.paros.view.View;
import org.parosproxy.paros.view.WorkbenchPanel;
import org.zaproxy.zap.utils.FontUtils;
import org.zaproxy.zap.utils.ZapHtmlLabel;

// ZAP: Added support for selecting the locale

public class OptionsParamView extends AbstractParam {

    private static final Logger LOGGER = LogManager.getLogger(OptionsParamView.class);

    private static final String DEFAULT_TIME_STAMP_FORMAT =
            Constant.messages.getString("timestamp.format.datetime");

    public static final String BASE_VIEW_KEY = "view";

    private static final String SHOW_TEXT_ICONS = "view.showTabNames";
    private static final String PROCESS_IMAGES = "view.processImages";
    public static final String LOCALE = "view.locale";
    public static final String DISPLAY_OPTION = "view.displayOption";
    private static final String RESPONSE_PANEL_POS_KEY =
            BASE_VIEW_KEY + ".messagePanelsPosition.lastSelectedPosition";
    public static final String BRK_PANEL_VIEW_OPTION = "view.brkPanelView";
    public static final String SHOW_MAIN_TOOLBAR_OPTION = "view.showMainToolbar";
    public static final String DEFAULT_LOCALE = "en_GB";
    public static final String ADVANCEDUI_OPTION = "view.advancedview";
    public static final String WMUIHANDLING_OPTION = "view.uiWmHandling";
    public static final String ASKONEXIT_OPTION = "view.askOnExit";
    public static final String WARN_ON_TAB_DOUBLE_CLICK_OPTION = "view.warnOnTabDoubleClick";
    public static final String MODE_OPTION = "view.mode";
    public static final String TAB_PIN_OPTION = "view.tab.pin";
    public static final String OUTPUT_TAB_TIMESTAMPING_OPTION = "view.outputTabsTimeStampsOption";
    public static final String OUTPUT_TAB_TIMESTAMP_FORMAT = "view.outputTabsTimeStampsFormat";

    /** The configuration key used to save/load the option {@link #showLocalConnectRequests}. */
    private static final String SHOW_LOCAL_CONNECT_REQUESTS = "view.showLocalConnectRequests";

    /** The configuration key used to save/load the option {@link #useSystemsLocaleForFormat}. */
    private static final String USE_SYSTEMS_LOCALE_FOR_FORMAT_KEY =
            BASE_VIEW_KEY + ".usesystemslocaleformat";

    public static final String SPLASHSCREEN_OPTION = "view.splashScreen";

    /**
     * @deprecated (2.12.0) No longer in use.
     */
    @Deprecated public static final String LARGE_REQUEST_SIZE = "view.largeRequest";

    /**
     * @deprecated (2.12.0) No longer in use.
     */
    @Deprecated public static final String LARGE_RESPONSE_SIZE = "view.largeResponse";

    public static final String FONT_NAME = "view.fontName";
    public static final String FONT_SIZE = "view.fontSize";
    public static final String ICON_SIZE = "view.iconSize";
    public static final String SCALE_IMAGES = "view.scaleImages";

    public static final String SHOW_DEV_WARNING = "view.showDevWarning";
    public static final String LOOK_AND_FEEL = "view.lookAndFeel";
    public static final String LOOK_AND_FEEL_CLASS = "view.lookAndFeelClass";
    public static final String ALLOW_APP_INTEGRATION_IN_CONTAINERS = "view.allowAppsInContainers";

    /**
     * The default look and feel: Flat Light.
     *
     * @since 2.10.0
     */
    public static final String DEFAULT_LOOK_AND_FEEL_NAME = "Flat Light";

    public static final String DEFAULT_LOOK_AND_FEEL_CLASS = "com.formdev.flatlaf.FlatLightLaf";
    public static final LookAndFeelInfo DEFAULT_LOOK_AND_FEEL =
            new LookAndFeelInfo(DEFAULT_LOOK_AND_FEEL_NAME, DEFAULT_LOOK_AND_FEEL_CLASS);

    private static final String CONFIRM_REMOVE_PROXY_EXCLUDE_REGEX_KEY =
            "view.confirmRemoveProxyExcludeRegex";
    private static final String CONFIRM_REMOVE_SCANNER_EXCLUDE_REGEX_KEY =
            "view.confirmRemoveScannerExcludeRegex";
    private static final String CONFIRM_REMOVE_SPIDER_EXCLUDE_REGEX_KEY =
            "view.confirmRemoveSpiderExcludeRegex";
    private static final String FONT_NAME_POSTFIX = "Name";
    private static final String FONT_SIZE_POSTFIX = "Size";
    private static final String RECENT_SESSIONS_KEY = BASE_VIEW_KEY + ".recentsessions.path";

    private int advancedViewEnabled = 0;
    private int processImages = 0;
    private int showMainToolbar = 1;
    private String configLocale = "";
    private String locale = "";
    private int displayOption = 1;
    private String responsePanelPosition;
    private int brkPanelViewOption = 0;
    private int askOnExitEnabled = 1;
    private int wmUiHandlingEnabled = 0;
    private boolean warnOnTabDoubleClick = false;
    private boolean showTabNames = true;
    private String mode = Mode.standard.name();
    private boolean outputTabTimeStampingEnabled = false;
    private String outputTabTimeStampFormat = DEFAULT_TIME_STAMP_FORMAT;
    private Map fontTypePrefixes =
            new EnumMap<>(FontUtils.FontType.class);
    private Map fontSizes = new EnumMap<>(FontUtils.FontType.class);
    private Map fontNames = new EnumMap<>(FontUtils.FontType.class);
    private int iconSize = 16;
    private List recentSessions;

    /**
     * Flag that indicates if the HTTP CONNECT requests received by the local proxy should be
     * (persisted and) shown in the UI.
     *
     * @see #SHOW_LOCAL_CONNECT_REQUESTS
     * @see #isShowLocalConnectRequests()
     * @see #setShowLocalConnectRequests(boolean)
     */
    private boolean showLocalConnectRequests;

    private boolean showSplashScreen = true;
    private boolean scaleImages = true;
    private boolean showDevWarning = true;
    private LookAndFeelInfo lookAndFeelInfo = DEFAULT_LOOK_AND_FEEL;
    private boolean allowAppIntegrationInContainers;

    private boolean confirmRemoveProxyExcludeRegex;
    private boolean confirmRemoveScannerExcludeRegex;
    private boolean confirmRemoveSpiderExcludeRegex;

    /**
     * Flag that indicates if the system's locale should be used for formatting.
     *
     * @see #USE_SYSTEMS_LOCALE_FOR_FORMAT_KEY
     * @see #isUseSystemsLocaleForFormat()
     * @see #setUseSystemsLocaleForFormat(boolean)
     */
    private boolean useSystemsLocaleForFormat;

    public OptionsParamView() {
        fontTypePrefixes.put(FontUtils.FontType.general, "font");
        fontTypePrefixes.put(FontUtils.FontType.workPanels, "workPanelsFont");

        for (FontUtils.FontType fontType : FontUtils.FontType.values()) {
            fontNames.put(fontType, "");
            fontSizes.put(fontType, -1);
        }
    }

    @Override
    protected void parse() {
        showTabNames = getBoolean(SHOW_TEXT_ICONS, true);
        processImages = getInt(PROCESS_IMAGES, 0);
        configLocale = getString(LOCALE, null); // No default
        locale = getString(LOCALE, DEFAULT_LOCALE);
        useSystemsLocaleForFormat = getBoolean(USE_SYSTEMS_LOCALE_FOR_FORMAT_KEY, true);
        displayOption = getInt(DISPLAY_OPTION, 1);
        responsePanelPosition =
                getString(
                        RESPONSE_PANEL_POS_KEY,
                        WorkbenchPanel.ResponsePanelPosition.TABS_SIDE_BY_SIDE.name());
        brkPanelViewOption = getInt(BRK_PANEL_VIEW_OPTION, 0);
        showMainToolbar = getInt(SHOW_MAIN_TOOLBAR_OPTION, 1);
        advancedViewEnabled = getInt(ADVANCEDUI_OPTION, 0);
        wmUiHandlingEnabled = getInt(WMUIHANDLING_OPTION, 0);
        askOnExitEnabled = getInt(ASKONEXIT_OPTION, 1);
        warnOnTabDoubleClick = getBoolean(WARN_ON_TAB_DOUBLE_CLICK_OPTION, true);
        mode = getString(MODE_OPTION, Mode.standard.name());
        outputTabTimeStampingEnabled = getBoolean(OUTPUT_TAB_TIMESTAMPING_OPTION, false);
        outputTabTimeStampFormat =
                getString(OUTPUT_TAB_TIMESTAMP_FORMAT, DEFAULT_TIME_STAMP_FORMAT);

        showLocalConnectRequests = getBoolean(SHOW_LOCAL_CONNECT_REQUESTS, false);

        showSplashScreen = getBoolean(SPLASHSCREEN_OPTION, true);

        for (FontUtils.FontType fontType : FontUtils.FontType.values()) {
            fontNames.put(fontType, getString(getFontNameConfKey(fontType), ""));
            fontSizes.put(fontType, getInt(getFontSizeConfKey(fontType), -1));
        }
        iconSize = getInt(ICON_SIZE, 16);

        scaleImages = getBoolean(SCALE_IMAGES, true);
        showDevWarning = getBoolean(SHOW_DEV_WARNING, true);
        lookAndFeelInfo =
                new LookAndFeelInfo(
                        getString(LOOK_AND_FEEL, DEFAULT_LOOK_AND_FEEL.getName()),
                        getString(LOOK_AND_FEEL_CLASS, DEFAULT_LOOK_AND_FEEL.getClassName()));

        allowAppIntegrationInContainers = getBoolean(ALLOW_APP_INTEGRATION_IN_CONTAINERS, false);

        this.confirmRemoveProxyExcludeRegex =
                getBoolean(CONFIRM_REMOVE_PROXY_EXCLUDE_REGEX_KEY, false);

        this.confirmRemoveScannerExcludeRegex =
                getBoolean(CONFIRM_REMOVE_SCANNER_EXCLUDE_REGEX_KEY, false);

        this.confirmRemoveSpiderExcludeRegex =
                getBoolean(CONFIRM_REMOVE_SPIDER_EXCLUDE_REGEX_KEY, false);

        recentSessions = new ArrayList<>();
        Stream.of(getConfig().getStringArray(RECENT_SESSIONS_KEY)).forEach(recentSessions::add);
    }

    /**
     * @return Returns the skipImage.
     */
    public int getProcessImages() {
        return processImages;
    }

    /**
     * @param processImages 0 = not to process. Other = process images
     */
    public void setProcessImages(int processImages) {
        this.processImages = processImages;
        getConfig().setProperty(PROCESS_IMAGES, Integer.toString(processImages));
    }

    public boolean isProcessImages() {
        return !(processImages == 0);
    }

    /**
     * Tells whether or not the main tool bar should be shown.
     *
     * @return {@code true} if the main tool bar should be shown, {@code false} otherwise.
     * @since 2.5.0
     */
    public boolean isShowMainToolbar() {
        return showMainToolbar != 0;
    }

    /**
     * Sets whether or not the main tool bar should be shown.
     *
     * @param show {@code true} if the main tool bar should be shown, {@code false} otherwise.
     * @since 2.5.0
     */
    public void setShowMainToolbar(boolean show) {
        this.showMainToolbar = show ? 1 : 0;
        getConfig().setProperty(SHOW_MAIN_TOOLBAR_OPTION, showMainToolbar);
    }

    /**
     * @return the locale, which should be used. It will return a default value, if nothing was
     *     configured yet. Never null
     * @see #getConfigLocale()
     */
    public String getLocale() {
        return locale;
    }

    public void setLocale(String locale) {
        if (locale != null) {
            this.locale = locale;
            getConfig().setProperty(LOCALE, locale);
        }
    }

    public void setLocale(Locale locale) {
        if (locale != null) {
            StringBuilder sb = new StringBuilder();
            sb.append(locale.getLanguage());
            if (locale.getCountry().length() > 0) sb.append("_").append(locale.getCountry());
            if (locale.getVariant().length() > 0) sb.append("_").append(locale.getVariant());
            setLocale(sb.toString());
        }
    }

    /**
     * @return The really configured locale, can be null
     * @see #getLocale()
     */
    public String getConfigLocale() {
        return configLocale;
    }

    public boolean getShowTabNames() {
        return showTabNames;
    }

    public void setShowTabNames(boolean showTabNames) {
        this.showTabNames = showTabNames;
        getConfig().setProperty(SHOW_TEXT_ICONS, showTabNames);
    }

    public int getBrkPanelViewOption() {
        return brkPanelViewOption;
    }

    public void setBrkPanelViewOption(int brkPanelViewIdx) {
        brkPanelViewOption = brkPanelViewIdx;
        getConfig().setProperty(BRK_PANEL_VIEW_OPTION, Integer.toString(brkPanelViewOption));
    }

    public int getDisplayOption() {
        return displayOption;
    }

    public void setDisplayOption(int displayOption) {
        this.displayOption = displayOption;
        getConfig().setProperty(DISPLAY_OPTION, Integer.toString(displayOption));
    }

    /**
     * Gets the name of the current response panel position.
     *
     * @return the name of the current position
     * @since 2.5.0
     * @see org.parosproxy.paros.view.WorkbenchPanel.ResponsePanelPosition
     */
    public String getResponsePanelPosition() {
        return responsePanelPosition;
    }

    /**
     * Sets the name of the current response panel position.
     *
     * @param position the name of the position
     * @since 2.5.0
     */
    public void setResponsePanelPosition(String position) {
        this.responsePanelPosition = position;
        getConfig().setProperty(RESPONSE_PANEL_POS_KEY, position);
    }

    public int getAdvancedViewOption() {
        return advancedViewEnabled;
    }

    public void setAdvancedViewOption(int isEnabled) {
        advancedViewEnabled = isEnabled;
        getConfig().setProperty(ADVANCEDUI_OPTION, Integer.toString(isEnabled));
    }

    public void setAskOnExitOption(int isEnabled) {
        askOnExitEnabled = isEnabled;
        getConfig().setProperty(ASKONEXIT_OPTION, Integer.toString(isEnabled));
    }

    public int getAskOnExitOption() {
        return askOnExitEnabled;
    }

    public void setWmUiHandlingOption(int isEnabled) {
        wmUiHandlingEnabled = isEnabled;
        getConfig().setProperty(WMUIHANDLING_OPTION, Integer.toString(isEnabled));
    }

    public int getWmUiHandlingOption() {
        return wmUiHandlingEnabled;
    }

    public boolean getWarnOnTabDoubleClick() {
        return warnOnTabDoubleClick;
    }

    public void setWarnOnTabDoubleClick(boolean warnOnTabDoubleClick) {
        this.warnOnTabDoubleClick = warnOnTabDoubleClick;
        getConfig().setProperty(WARN_ON_TAB_DOUBLE_CLICK_OPTION, warnOnTabDoubleClick);
    }

    public String getMode() {
        return mode;
    }

    public void setMode(String mode) {
        this.mode = mode;
        getConfig().setProperty(MODE_OPTION, mode);
    }

    public void setOutputTabTimeStampingEnabled(boolean enabled) {
        outputTabTimeStampingEnabled = enabled;
        getConfig().setProperty(OUTPUT_TAB_TIMESTAMPING_OPTION, enabled);
    }

    public boolean isOutputTabTimeStampingEnabled() {
        return outputTabTimeStampingEnabled;
    }

    public void setOutputTabTimeStampsFormat(String format) {
        outputTabTimeStampFormat = format;
        getConfig().setProperty(OUTPUT_TAB_TIMESTAMP_FORMAT, format);
    }

    public String getOutputTabTimeStampsFormat() {
        return outputTabTimeStampFormat;
    }

    /**
     * Sets whether or not the HTTP CONNECT requests received by the local proxy should be
     * (persisted and) shown in the UI.
     *
     * @param showConnectRequests {@code true} if the HTTP CONNECT requests should be shown, {@code
     *     false} otherwise
     * @since 2.5.0
     * @see #isShowLocalConnectRequests()
     */
    public void setShowLocalConnectRequests(boolean showConnectRequests) {
        if (showLocalConnectRequests != showConnectRequests) {
            showLocalConnectRequests = showConnectRequests;
            getConfig().setProperty(SHOW_LOCAL_CONNECT_REQUESTS, showConnectRequests);
        }
    }

    /**
     * Tells whether or not the HTTP CONNECT requests received by the local proxy should be
     * (persisted and) shown in the UI.
     *
     * 

The default is to not show the HTTP CONNECT requests. * * @return {@code true} if the HTTP CONNECT requests should be shown, {@code false} otherwise * @since 2.5.0 * @see #setShowLocalConnectRequests(boolean) */ public boolean isShowLocalConnectRequests() { return showLocalConnectRequests; } public boolean isShowSplashScreen() { return showSplashScreen; } public void setShowSplashScreen(boolean showSplashScreen) { this.showSplashScreen = showSplashScreen; getConfig().setProperty(SPLASHSCREEN_OPTION, showSplashScreen); } /** * @deprecated (2.12.0) No longer in use. */ @Deprecated public int getLargeRequestSize() { return 100000; } /** * @deprecated (2.12.0) No longer in use. */ @Deprecated public void setLargeRequestSize(int largeRequestSize) {} /** * @deprecated (2.12.0) No longer in use. */ @Deprecated public int getLargeResponseSize() { return 100000; } /** * @deprecated (2.12.0) No longer in use. */ @Deprecated public void setLargeResponseSize(int largeResponseSize) {} /** * @since 2.11.0 */ public boolean isAllowAppIntegrationInContainers() { return allowAppIntegrationInContainers; } /** * @since 2.11.0 */ public void setAllowAppIntegrationInContainers(boolean allowAppIntegrationInContainers) { this.allowAppIntegrationInContainers = allowAppIntegrationInContainers; getConfig() .setProperty(ALLOW_APP_INTEGRATION_IN_CONTAINERS, allowAppIntegrationInContainers); } /** * @deprecated (2.8.0) Replaced by {@link * #getFontSize(org.zaproxy.zap.utils.FontUtils.FontType)}. */ @Deprecated public int getFontSize() { return getFontSize(FontUtils.FontType.general); } public int getFontSize(FontUtils.FontType fontType) { return fontSizes.get(fontType); } /** * @deprecated (2.8.0) Replaced by {@link #setFontSize(org.zaproxy.zap.utils.FontUtils.FontType, * int)}. */ @Deprecated public void setFontSize(int fontSize) { setFontSize(FontUtils.FontType.general, fontSize); } public void setFontSize(FontUtils.FontType fontType, int fontSize) { fontSizes.put(fontType, fontSize); getConfig().setProperty(getFontSizeConfKey(fontType), fontSize); } public int getIconSize() { return iconSize; } public void setIconSize(int iconSize) { this.iconSize = iconSize; getConfig().setProperty(ICON_SIZE, iconSize); } /** * @deprecated (2.8.0) Replaced by {@link * #getFontName(org.zaproxy.zap.utils.FontUtils.FontType)}. */ @Deprecated public String getFontName() { return getFontName(FontUtils.FontType.general); } public String getFontName(FontUtils.FontType fontType) { return fontNames.get(fontType); } /** * @deprecated (2.8.0) Replaced by {@link #setFontName(org.zaproxy.zap.utils.FontUtils.FontType, * String)}. */ @Deprecated public void setFontName(String fontName) { setFontName(FontUtils.FontType.general, fontName); } public void setFontName(FontUtils.FontType fontType, String fontName) { fontNames.put(fontType, fontName); getConfig().setProperty(getFontNameConfKey(fontType), fontName); } /** * Gets the name of the selected look and feel. * * @return the name, might be {@code null} or empty if none selected (i.e. using default). * @see #getLookAndFeelInfo() * @since 2.8.0 */ public String getLookAndFeel() { return this.lookAndFeelInfo.getName(); } /** * Sets the name of the selected look and feel. * * @param lookAndFeel the name. * @since 2.8.0 * @deprecated (2.10.0) Use {@link #setLookAndFeelInfo(LookAndFeelInfo)} instead, which * preserves the class of the look and feel. */ @Deprecated public void setLookAndFeel(String lookAndFeel) { setLookAndFeelInfo(new LookAndFeelInfo(lookAndFeel, "")); } /** * Gets the info of the selected look and feel. * * @return the info of the look and feel. * @since 2.10.0 * @see #getLookAndFeel() */ public LookAndFeelInfo getLookAndFeelInfo() { return this.lookAndFeelInfo; } /** * Sets the info of the selected look and feel. * * @param lookAndFeelInfo the info of the look and feel. * @throws NullPointerException if the given parameter is null. * @since 2.10.0 */ public void setLookAndFeelInfo(LookAndFeelInfo lookAndFeelInfo) { LookAndFeelInfo oldLookAndFeel = this.lookAndFeelInfo; this.lookAndFeelInfo = Objects.requireNonNull(lookAndFeelInfo); if (!oldLookAndFeel.getClassName().equals(this.getLookAndFeelInfo().getClassName())) { // Only dynamically apply the LaF if its changed getConfig().setProperty(LOOK_AND_FEEL, lookAndFeelInfo.getName()); getConfig().setProperty(LOOK_AND_FEEL_CLASS, lookAndFeelInfo.getClassName()); if (View.isInitialised()) { final JDialog dialog = new SwitchingLookAndFeelDialog(); dialog.setVisible(true); // Wait for 1/2 sec to allow the warning dialog to be rendered Timer timer = new Timer( 500, e -> { try { UIManager.setLookAndFeel(lookAndFeelInfo.getClassName()); Arrays.asList(Window.getWindows()).stream() .forEach(SwingUtilities::updateComponentTreeUI); View.getSingleton() .getPopupList() .forEach(SwingUtilities::updateComponentTreeUI); } catch (Exception e2) { LOGGER.warn( "Failed to set the look and feel: {}", e2.getMessage()); } finally { dialog.setVisible(false); dialog.dispose(); } }); timer.setRepeats(false); timer.start(); } } } public boolean isScaleImages() { return scaleImages; } public void setScaleImages(boolean scaleImages) { this.scaleImages = scaleImages; getConfig().setProperty(SCALE_IMAGES, scaleImages); } public boolean isShowDevWarning() { return showDevWarning; } public void setShowDevWarning(boolean showDevWarning) { this.showDevWarning = showDevWarning; getConfig().setProperty(SHOW_DEV_WARNING, showDevWarning); } public boolean isConfirmRemoveProxyExcludeRegex() { return this.confirmRemoveProxyExcludeRegex; } public void setConfirmRemoveProxyExcludeRegex(boolean confirmRemove) { this.confirmRemoveProxyExcludeRegex = confirmRemove; getConfig().setProperty(CONFIRM_REMOVE_PROXY_EXCLUDE_REGEX_KEY, confirmRemove); } public boolean isConfirmRemoveScannerExcludeRegex() { return this.confirmRemoveScannerExcludeRegex; } public void setConfirmRemoveScannerExcludeRegex(boolean confirmRemove) { this.confirmRemoveScannerExcludeRegex = confirmRemove; getConfig().setProperty(CONFIRM_REMOVE_SCANNER_EXCLUDE_REGEX_KEY, confirmRemove); } public boolean isConfirmRemoveSpiderExcludeRegex() { return this.confirmRemoveSpiderExcludeRegex; } public void setConfirmRemoveSpiderExcludeRegex(boolean confirmRemove) { this.confirmRemoveSpiderExcludeRegex = confirmRemove; getConfig().setProperty(CONFIRM_REMOVE_SPIDER_EXCLUDE_REGEX_KEY, confirmRemove); } /** * Sets whether or not the system's locale should be used for formatting. * * @param useSystemsLocale {@code true} if the system's locale should be used for formatting, * {@code false} otherwise. * @since 2.7.0 * @see #isUseSystemsLocaleForFormat() * @see java.util.Locale.Category#FORMAT */ public void setUseSystemsLocaleForFormat(boolean useSystemsLocale) { if (useSystemsLocaleForFormat != useSystemsLocale) { useSystemsLocaleForFormat = useSystemsLocale; getConfig().setProperty(USE_SYSTEMS_LOCALE_FOR_FORMAT_KEY, useSystemsLocaleForFormat); } } /** * Tells whether or not the system's locale should be used for formatting. * * @return {@code true} if the system's locale should be used for formatting, {@code false} * otherwise. * @since 2.7.0 * @see #setUseSystemsLocaleForFormat(boolean) * @see java.util.Locale.Category#FORMAT */ public boolean isUseSystemsLocaleForFormat() { return useSystemsLocaleForFormat; } private String getFontConfKey(FontUtils.FontType fontType, String postfix) { StringBuilder result = new StringBuilder(); result.append("view."); result.append(fontTypePrefixes.get(fontType)); result.append(postfix); return result.toString(); } private String getFontNameConfKey(FontUtils.FontType fontType) { return getFontConfKey(fontType, FONT_NAME_POSTFIX); } private String getFontSizeConfKey(FontUtils.FontType fontType) { return getFontConfKey(fontType, FONT_SIZE_POSTFIX); } private static class SwitchingLookAndFeelDialog extends AbstractDialog { private static final long serialVersionUID = 1L; private JPanel mainPanel; public SwitchingLookAndFeelDialog() { super(View.getSingleton().getMainFrame(), false); this.setContentPane(getMainPanel()); this.pack(); } private JPanel getMainPanel() { if (mainPanel == null) { mainPanel = new JPanel(); mainPanel.add( new ZapHtmlLabel( Constant.messages.getString("view.options.warn.applylaf"))); } return mainPanel; } } public List getRecentSessions() { return recentSessions; } public void addLatestSession(String path) { int index = recentSessions.indexOf(path); if (index == 0) { return; } if (index > 0) { recentSessions.remove(index); } recentSessions.add(0, path); if (recentSessions.size() > 10) { recentSessions.subList(10, recentSessions.size()).clear(); } getConfig().clearProperty(RECENT_SESSIONS_KEY); for (int i = 0; i < recentSessions.size(); ++i) { getConfig().setProperty(RECENT_SESSIONS_KEY + "(" + i + ")", recentSessions.get(i)); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy