org.exbin.deltahex.intellij.panel.DeltaHexOptionsPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.exbin.deltahex.intellij.panel.DeltaHexOptionsPanel.java

Source

/*
 * Copyright (C) ExBin Project
 *
 * This application or library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 *
 * This application or library 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 GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along this application.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.exbin.deltahex.intellij.panel;

import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.ui.DialogWrapper;
import org.exbin.deltahex.*;
import org.exbin.deltahex.delta.DeltaDocument;
import org.exbin.deltahex.highlight.swing.HighlightNonAsciiCodeAreaPainter;
import org.exbin.deltahex.intellij.DeltaHexFileEditor;
import org.exbin.deltahex.intellij.DialogUtils;
import org.exbin.deltahex.swing.CodeArea;
import org.exbin.deltahex.swing.CodeAreaSpace;
import org.exbin.framework.editor.text.panel.TextFontOptionsPanel;
import org.exbin.framework.editor.text.panel.TextFontPanel;
import org.exbin.framework.gui.utils.LanguageUtils;
import org.exbin.framework.gui.utils.WindowUtils;
import org.exbin.framework.gui.utils.handler.DefaultControlHandler;
import org.exbin.framework.gui.utils.panel.DefaultControlPanel;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.font.TextAttribute;
import java.util.HashMap;
import java.util.Map;

/**
 * Hexadecimal editor options panel.
 *
 * @author ExBin Project (http://exbin.org)
 * @version 0.1.5 2017/09/30
 */
public class DeltaHexOptionsPanel extends javax.swing.JPanel {

    private final PropertiesComponent preferences;
    private final java.util.ResourceBundle resourceBundle = LanguageUtils
            .getResourceBundleByClass(DeltaHexOptionsPanel.class);

    private DefaultListModel<CategoryItem> categoryModel = new DefaultListModel<>();
    private JPanel currentCategoryPanel = null;

    private Font deltaHexDefaultFont = new Font(Font.MONOSPACED, Font.PLAIN, 12);
    private Font deltaHexFont = new Font(Font.MONOSPACED, Font.PLAIN, 12);

    public DeltaHexOptionsPanel() {
        initComponents();
        preferences = DeltaHexFileEditor.getPreferences();

        categoryModel.addElement(new CategoryItem("Mode", modePanel));
        categoryModel.addElement(new CategoryItem("Layout", layoutPanel));
        categoryModel.addElement(new CategoryItem("Decoration", decorationPanel));
        categoryModel.addElement(new CategoryItem("Fonts & Colors", fontsAndColorPanel));
        categoriesList.setModel(categoryModel);

        categoriesList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                int selectedIndex = categoriesList.getSelectedIndex();
                if (selectedIndex >= 0) {
                    CategoryItem categoryItem = categoryModel.get(selectedIndex);
                    currentCategoryPanel = categoryItem.getCategoryPanel();
                    mainPane.setViewportView(currentCategoryPanel);
                    mainPane.invalidate();
                    revalidate();
                    mainPane.repaint();
                }
            }
        });
        categoriesList.setCellRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList<?> list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus) {
                Component component = super.getListCellRendererComponent(list, ((CategoryItem) value).categoryName,
                        index, isSelected, cellHasFocus);
                return component;
            }
        });
        categoriesList.setSelectedIndex(0);
        updateFontTextField();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        layoutPanel = new javax.swing.JPanel();
        wrapLineModeCheckBox = new javax.swing.JCheckBox();
        lineLengthLabel = new javax.swing.JLabel();
        lineLengthSpinner = new javax.swing.JSpinner();
        headerPanel = new javax.swing.JPanel();
        showHeaderCheckBox = new javax.swing.JCheckBox();
        headerSpaceLabel = new javax.swing.JLabel();
        headerSpaceComboBox = new javax.swing.JComboBox<>();
        headerSpaceSpinner = new javax.swing.JSpinner();
        lineNumbersPanel = new javax.swing.JPanel();
        showLineNumbersCheckBox = new javax.swing.JCheckBox();
        lineNumberLengthLabel = new javax.swing.JLabel();
        lineNumbersLengthComboBox = new javax.swing.JComboBox<>();
        lineNumbersLengthSpinner = new javax.swing.JSpinner();
        lineNumberSpaceLabel = new javax.swing.JLabel();
        lineNumbersSpaceComboBox = new javax.swing.JComboBox<>();
        lineNumbersSpaceSpinner = new javax.swing.JSpinner();
        byteGroupSizeLabel = new javax.swing.JLabel();
        byteGroupSizeSpinner = new javax.swing.JSpinner();
        spaceGroupSizeSpinner = new javax.swing.JSpinner();
        spaceGroupSizeLabel = new javax.swing.JLabel();
        modePanel = new javax.swing.JPanel();
        codeTypeScrollModeLabel = new javax.swing.JLabel();
        codeTypeComboBox = new javax.swing.JComboBox<>();
        viewModeComboBox = new javax.swing.JComboBox<>();
        showNonprintableCharactersCheckBox = new javax.swing.JCheckBox();
        viewModeScrollModeLabel = new javax.swing.JLabel();
        codeColorizationCheckBox = new javax.swing.JCheckBox();
        memoryModeLabel = new javax.swing.JLabel();
        memoryModeComboBox = new javax.swing.JComboBox<>();
        showValuesPanelCheckBox = new javax.swing.JCheckBox();
        decorationPanel = new javax.swing.JPanel();
        hexCharactersModeLabel = new javax.swing.JLabel();
        backgroundModeLabel = new javax.swing.JLabel();
        hexCharactersModeComboBox = new javax.swing.JComboBox<>();
        backgroundModeComboBox = new javax.swing.JComboBox<>();
        positionCodeTypeLabel = new javax.swing.JLabel();
        lineNumbersBackgroundCheckBox = new javax.swing.JCheckBox();
        positionCodeTypeComboBox = new javax.swing.JComboBox<>();
        linesPanel = new javax.swing.JPanel();
        decoratorLineNumLineCheckBox = new javax.swing.JCheckBox();
        decoratorPreviewLineCheckBox = new javax.swing.JCheckBox();
        decoratorBoxCheckBox = new javax.swing.JCheckBox();
        decoratorHeaderLineCheckBox = new javax.swing.JCheckBox();
        fontsAndColorPanel = new javax.swing.JPanel();
        fontLabel = new javax.swing.JLabel();
        fontTextField = new javax.swing.JTextField();
        selectFontButton = new javax.swing.JButton();
        useDefaultFontCheckBox = new javax.swing.JCheckBox();
        colorsLabel = new javax.swing.JLabel();
        categoriesLabel = new javax.swing.JLabel();
        categoriesScrollPane = new javax.swing.JScrollPane();
        categoriesList = new javax.swing.JList<>();
        mainPane = new javax.swing.JScrollPane();

        wrapLineModeCheckBox.setText(resourceBundle.getString("wrapLineModeCheckBox.text")); // NOI18N

        lineLengthLabel.setText(resourceBundle.getString("lineLengthLabel.text")); // NOI18N

        lineLengthSpinner.setModel(new javax.swing.SpinnerNumberModel(16, 1, null, 1));

        headerPanel.setBorder(
                javax.swing.BorderFactory.createTitledBorder(resourceBundle.getString("headerPanel.border.title"))); // NOI18N

        showHeaderCheckBox.setText(resourceBundle.getString("showHeaderCheckBox.text")); // NOI18N

        headerSpaceLabel.setText(resourceBundle.getString("headerSpaceLabel.text")); // NOI18N

        headerSpaceComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "NONE", "SPECIFIED",
                "QUARTER_UNIT", "HALF_UNIT", "ONE_UNIT", "ONE_AND_HALF_UNIT", "DOUBLE_UNIT" }));
        headerSpaceComboBox.setSelectedIndex(2);

        headerSpaceSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1));

        javax.swing.GroupLayout headerPanelLayout = new javax.swing.GroupLayout(headerPanel);
        headerPanel.setLayout(headerPanelLayout);
        headerPanelLayout.setHorizontalGroup(headerPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(headerPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(headerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(headerPanelLayout.createSequentialGroup()
                                        .addComponent(headerSpaceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                140, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(headerSpaceSpinner))
                                .addGroup(headerPanelLayout.createSequentialGroup()
                                        .addGroup(headerPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(showHeaderCheckBox).addComponent(headerSpaceLabel))
                                        .addGap(0, 0, Short.MAX_VALUE)))
                        .addContainerGap()));
        headerPanelLayout.setVerticalGroup(headerPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(headerPanelLayout.createSequentialGroup().addComponent(showHeaderCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(headerSpaceLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(headerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(headerSpaceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(headerSpaceSpinner, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        lineNumbersPanel.setBorder(javax.swing.BorderFactory
                .createTitledBorder(resourceBundle.getString("lineNumbersPanel.border.title"))); // NOI18N

        showLineNumbersCheckBox.setText(resourceBundle.getString("showLineNumbersCheckBox.text")); // NOI18N

        lineNumberLengthLabel.setText(resourceBundle.getString("lineNumberLengthLabel.text")); // NOI18N

        lineNumbersLengthComboBox
                .setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "AUTO", "SPECIFIED" }));
        lineNumbersLengthComboBox.setSelectedIndex(1);

        lineNumbersLengthSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1));
        lineNumbersLengthSpinner.setValue(8);

        lineNumberSpaceLabel.setText(resourceBundle.getString("lineNumberSpaceLabel.text")); // NOI18N

        lineNumbersSpaceComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "NONE", "SPECIFIED",
                "QUARTER_UNIT", "HALF_UNIT", "ONE_UNIT", "ONE_AND_HALF_UNIT", "DOUBLE_UNIT" }));
        lineNumbersSpaceComboBox.setSelectedIndex(4);

        lineNumbersSpaceSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1));

        javax.swing.GroupLayout lineNumbersPanelLayout = new javax.swing.GroupLayout(lineNumbersPanel);
        lineNumbersPanel.setLayout(lineNumbersPanelLayout);
        lineNumbersPanelLayout.setHorizontalGroup(
                lineNumbersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(lineNumbersPanelLayout.createSequentialGroup()
                                .addComponent(showLineNumbersCheckBox).addGap(0, 0, Short.MAX_VALUE))
                        .addGroup(lineNumbersPanelLayout.createSequentialGroup().addContainerGap()
                                .addGroup(lineNumbersPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(lineNumbersPanelLayout.createSequentialGroup()
                                                .addComponent(lineNumbersLengthComboBox,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 140,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(lineNumbersLengthSpinner))
                                        .addGroup(lineNumbersPanelLayout.createSequentialGroup()
                                                .addGroup(lineNumbersPanelLayout
                                                        .createParallelGroup(
                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(lineNumberLengthLabel)
                                                        .addComponent(lineNumberSpaceLabel))
                                                .addGap(0, 0, Short.MAX_VALUE))
                                        .addGroup(lineNumbersPanelLayout.createSequentialGroup()
                                                .addComponent(lineNumbersSpaceComboBox,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 140,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(lineNumbersSpaceSpinner)))
                                .addContainerGap()));
        lineNumbersPanelLayout.setVerticalGroup(lineNumbersPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(lineNumbersPanelLayout.createSequentialGroup().addComponent(showLineNumbersCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lineNumberLengthLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(lineNumbersPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lineNumbersLengthComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(lineNumbersLengthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lineNumberSpaceLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(lineNumbersPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lineNumbersSpaceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(lineNumbersSpaceSpinner, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        byteGroupSizeLabel.setText(resourceBundle.getString("byteGroupSizeLabel.text")); // NOI18N

        byteGroupSizeSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1));

        spaceGroupSizeSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1));

        spaceGroupSizeLabel.setText(resourceBundle.getString("spaceGroupSizeLabel.text")); // NOI18N

        javax.swing.GroupLayout layoutPanelLayout = new javax.swing.GroupLayout(layoutPanel);
        layoutPanel.setLayout(layoutPanelLayout);
        layoutPanelLayout.setHorizontalGroup(layoutPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layoutPanelLayout.createSequentialGroup().addContainerGap().addGroup(layoutPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layoutPanelLayout.createSequentialGroup()
                                .addGroup(layoutPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(lineLengthLabel).addComponent(wrapLineModeCheckBox))
                                .addGap(67, 67, 67))
                        .addComponent(spaceGroupSizeSpinner).addComponent(byteGroupSizeSpinner)
                        .addComponent(headerPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(lineLengthSpinner)
                        .addComponent(lineNumbersPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(layoutPanelLayout.createSequentialGroup().addGroup(layoutPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(byteGroupSizeLabel, javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(spaceGroupSizeLabel, javax.swing.GroupLayout.Alignment.LEADING))
                                .addGap(0, 0, Short.MAX_VALUE)))
                        .addContainerGap()));
        layoutPanelLayout.setVerticalGroup(layoutPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layoutPanelLayout.createSequentialGroup().addContainerGap()
                        .addComponent(wrapLineModeCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lineLengthLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lineLengthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(headerPanel, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lineNumbersPanel, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(byteGroupSizeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(byteGroupSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(spaceGroupSizeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(spaceGroupSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        codeTypeScrollModeLabel.setText(resourceBundle.getString("codeTypeScrollModeLabel.text")); // NOI18N

        codeTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(
                new String[] { "BINARY", "OCTAL", "DECIMAL", "HEXADECIMAL" }));
        codeTypeComboBox.setSelectedIndex(3);

        viewModeComboBox.setModel(
                new javax.swing.DefaultComboBoxModel<>(new String[] { "DUAL", "HEXADECIMAL", "PREVIEW" }));

        showNonprintableCharactersCheckBox
                .setText(resourceBundle.getString("showNonprintableCharactersCheckBox.text")); // NOI18N

        viewModeScrollModeLabel.setText(resourceBundle.getString("viewModeScrollModeLabel.text")); // NOI18N

        codeColorizationCheckBox.setText(resourceBundle.getString("codeColorizationCheckBox.text")); // NOI18N

        memoryModeLabel.setText(resourceBundle.getString("memoryModeLabel.text")); // NOI18N

        memoryModeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "DELTA", "MEMORY" }));

        showValuesPanelCheckBox.setText(resourceBundle.getString("showValuesPanelCheckBox.text")); // NOI18N

        javax.swing.GroupLayout modePanelLayout = new javax.swing.GroupLayout(modePanel);
        modePanel.setLayout(modePanelLayout);
        modePanelLayout.setHorizontalGroup(modePanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(modePanelLayout.createSequentialGroup().addContainerGap().addGroup(modePanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(memoryModeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(viewModeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(showNonprintableCharactersCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(codeTypeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(codeColorizationCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(modePanelLayout.createSequentialGroup()
                                .addGroup(modePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(viewModeScrollModeLabel).addComponent(codeTypeScrollModeLabel)
                                        .addComponent(memoryModeLabel))
                                .addGap(0, 0, Short.MAX_VALUE))
                        .addComponent(showValuesPanelCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addContainerGap()));
        modePanelLayout.setVerticalGroup(modePanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(modePanelLayout.createSequentialGroup().addContainerGap()
                        .addComponent(viewModeScrollModeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(viewModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(codeTypeScrollModeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(codeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(showNonprintableCharactersCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(codeColorizationCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(showValuesPanelCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(memoryModeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(memoryModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        hexCharactersModeLabel.setText(resourceBundle.getString("hexCharactersModeLabel.text")); // NOI18N

        backgroundModeLabel.setText(resourceBundle.getString("backgroundModeLabel.text")); // NOI18N

        hexCharactersModeComboBox
                .setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "LOWER", "UPPER" }));

        backgroundModeComboBox.setModel(
                new javax.swing.DefaultComboBoxModel<>(new String[] { "NONE", "PLAIN", "STRIPPED", "GRIDDED" }));
        backgroundModeComboBox.setSelectedIndex(2);

        positionCodeTypeLabel.setText(resourceBundle.getString("positionCodeTypeLabel.text")); // NOI18N

        lineNumbersBackgroundCheckBox.setText(resourceBundle.getString("lineNumbersBackgroundCheckBox.text")); // NOI18N

        positionCodeTypeComboBox.setModel(
                new javax.swing.DefaultComboBoxModel<>(new String[] { "OCTAL", "DECIMAL", "HEXADECIMAL" }));
        positionCodeTypeComboBox.setSelectedIndex(2);

        linesPanel.setBorder(
                javax.swing.BorderFactory.createTitledBorder(resourceBundle.getString("linesPanel.border.title"))); // NOI18N

        decoratorLineNumLineCheckBox.setText(resourceBundle.getString("decoratorLineNumLineCheckBox.text")); // NOI18N

        decoratorPreviewLineCheckBox.setText(resourceBundle.getString("decoratorPreviewLineCheckBox.text")); // NOI18N

        decoratorBoxCheckBox.setText(resourceBundle.getString("decoratorBoxCheckBox.text")); // NOI18N

        decoratorHeaderLineCheckBox.setText(resourceBundle.getString("decoratorHeaderLineCheckBox.text")); // NOI18N

        javax.swing.GroupLayout linesPanelLayout = new javax.swing.GroupLayout(linesPanel);
        linesPanel.setLayout(linesPanelLayout);
        linesPanelLayout.setHorizontalGroup(linesPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(linesPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(linesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(decoratorLineNumLineCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(decoratorPreviewLineCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(decoratorBoxCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(decoratorHeaderLineCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addContainerGap()));
        linesPanelLayout
                .setVerticalGroup(linesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(linesPanelLayout.createSequentialGroup().addComponent(decoratorHeaderLineCheckBox)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(decoratorLineNumLineCheckBox)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(decoratorPreviewLineCheckBox)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(decoratorBoxCheckBox)));

        javax.swing.GroupLayout decorationPanelLayout = new javax.swing.GroupLayout(decorationPanel);
        decorationPanel.setLayout(decorationPanelLayout);
        decorationPanelLayout
                .setHorizontalGroup(
                        decorationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(decorationPanelLayout.createSequentialGroup().addContainerGap()
                                        .addGroup(decorationPanelLayout.createParallelGroup(
                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                .addGroup(decorationPanelLayout.createSequentialGroup()
                                                        .addComponent(backgroundModeLabel)
                                                        .addGap(0, 0, Short.MAX_VALUE))
                                                .addGroup(decorationPanelLayout
                                                        .createSequentialGroup().addGroup(decorationPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                .addComponent(hexCharactersModeLabel)
                                                                .addComponent(positionCodeTypeLabel))
                                                        .addGap(138, 138, 138))
                                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                                        decorationPanelLayout.createSequentialGroup()
                                                                .addGroup(decorationPanelLayout.createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.TRAILING)
                                                                        .addComponent(positionCodeTypeComboBox,
                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                0,
                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                Short.MAX_VALUE)
                                                                        .addComponent(
                                                                                hexCharactersModeComboBox,
                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                0,
                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                Short.MAX_VALUE)
                                                                        .addComponent(
                                                                                backgroundModeComboBox,
                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                0,
                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                Short.MAX_VALUE)
                                                                        .addComponent(
                                                                                lineNumbersBackgroundCheckBox,
                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                Short.MAX_VALUE)
                                                                        .addComponent(linesPanel,
                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                Short.MAX_VALUE))
                                                                .addContainerGap()))));
        decorationPanelLayout.setVerticalGroup(decorationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, decorationPanelLayout.createSequentialGroup()
                        .addContainerGap().addComponent(backgroundModeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(backgroundModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lineNumbersBackgroundCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(linesPanel, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(hexCharactersModeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(hexCharactersModeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(positionCodeTypeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(positionCodeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        fontLabel.setText(resourceBundle.getString("fontLabel.text")); // NOI18N

        fontTextField.setEditable(false);
        fontTextField.setText(resourceBundle.getString("fontTextField.text")); // NOI18N

        selectFontButton.setText(resourceBundle.getString("selectFontButton.text")); // NOI18N
        selectFontButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                selectFontButtonActionPerformed(evt);
            }
        });

        useDefaultFontCheckBox.setText(resourceBundle.getString("useDefaultFontCheckBox.text")); // NOI18N

        colorsLabel.setText(resourceBundle.getString("colorsLabel.text")); // NOI18N

        javax.swing.GroupLayout fontsAndColorPanelLayout = new javax.swing.GroupLayout(fontsAndColorPanel);
        fontsAndColorPanel.setLayout(fontsAndColorPanelLayout);
        fontsAndColorPanelLayout.setHorizontalGroup(fontsAndColorPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(fontsAndColorPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(fontsAndColorPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(fontsAndColorPanelLayout.createSequentialGroup()
                                        .addComponent(fontTextField)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(selectFontButton, javax.swing.GroupLayout.PREFERRED_SIZE, 31,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(fontsAndColorPanelLayout.createSequentialGroup()
                                        .addGroup(fontsAndColorPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(useDefaultFontCheckBox).addComponent(fontLabel)
                                                .addComponent(colorsLabel))
                                        .addGap(0, 0, Short.MAX_VALUE)))
                        .addContainerGap()));
        fontsAndColorPanelLayout.setVerticalGroup(fontsAndColorPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(fontsAndColorPanelLayout.createSequentialGroup().addContainerGap()
                        .addComponent(useDefaultFontCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(fontLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(fontsAndColorPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(fontTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(selectFontButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(colorsLabel)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        categoriesLabel.setText("Categories:");

        categoriesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        categoriesScrollPane.setViewportView(categoriesList);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addComponent(categoriesLabel)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(layout.createSequentialGroup()
                        .addComponent(categoriesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 169,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(mainPane, javax.swing.GroupLayout.DEFAULT_SIZE, 20, Short.MAX_VALUE)));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addComponent(categoriesLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(categoriesScrollPane).addComponent(mainPane))));
    }// </editor-fold>//GEN-END:initComponents

    private void selectFontButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectFontButtonActionPerformed
        final TextFontPanel textFontPanel = new TextFontPanel();

        DefaultControlPanel textFontControlPanel = new DefaultControlPanel();
        textFontPanel.setStoredFont(deltaHexFont);
        textFontPanel.setVisible(true);
        JPanel dialogPanel = WindowUtils.createDialogPanel(textFontPanel, textFontControlPanel);
        WindowUtils.assignGlobalKeyListener(dialogPanel, textFontControlPanel.createOkCancelListener());
        final DialogWrapper dialog = DialogUtils.createDialog(dialogPanel, "Select Font");

        textFontControlPanel.setHandler(new DefaultControlHandler() {
            @Override
            public void controlActionPerformed(DefaultControlHandler.ControlActionType actionType) {
                if (actionType == DefaultControlHandler.ControlActionType.OK) {
                    deltaHexFont = textFontPanel.getStoredFont();
                    updateFontTextField();
                    useDefaultFontCheckBox.setSelected(false);
                }

                dialog.close(0);
            }
        });
        dialog.showAndGet();
    }//GEN-LAST:event_selectFontButtonActionPerformed

    public void load() {
        // Layout
        wrapLineModeCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_LINE_WRAPPING, false));
        lineLengthSpinner.setValue(preferences.getInt(DeltaHexFileEditor.PREFERENCES_BYTES_PER_LINE, 16));
        showHeaderCheckBox.setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_SHOW_HEADER, true));
        String headerSpaceTypeName = preferences.getValue(DeltaHexFileEditor.PREFERENCES_HEADER_SPACE_TYPE,
                CodeAreaSpace.SpaceType.HALF_UNIT.name());
        CodeAreaSpace.SpaceType headerSpaceType = CodeAreaSpace.SpaceType.valueOf(headerSpaceTypeName);
        headerSpaceComboBox.setSelectedIndex(headerSpaceType.ordinal());
        headerSpaceSpinner.setValue(preferences.getInt(DeltaHexFileEditor.PREFERENCES_HEADER_SPACE, 0));
        showLineNumbersCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_SHOW_LINE_NUMBERS, true));
        String lineNumbersSpaceTypeName = preferences.getValue(
                DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_SPACE_TYPE, CodeAreaSpace.SpaceType.ONE_UNIT.name());
        CodeAreaSpace.SpaceType lineNumbersSpaceType = CodeAreaSpace.SpaceType.valueOf(lineNumbersSpaceTypeName);
        lineNumbersSpaceComboBox.setSelectedIndex(lineNumbersSpaceType.ordinal());
        lineNumbersSpaceSpinner.setValue(preferences.getInt(DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_SPACE, 8));
        String lineNumbersLengthTypeName = preferences.getValue(
                DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_LENGTH_TYPE,
                CodeAreaLineNumberLength.LineNumberType.SPECIFIED.name());
        CodeAreaLineNumberLength.LineNumberType lineNumbersLengthType = CodeAreaLineNumberLength.LineNumberType
                .valueOf(lineNumbersLengthTypeName);
        lineNumbersLengthComboBox.setSelectedIndex(lineNumbersLengthType.ordinal());
        lineNumbersLengthSpinner
                .setValue(preferences.getInt(DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_LENGTH, 8));
        byteGroupSizeSpinner.setValue(preferences.getInt(DeltaHexFileEditor.PREFERENCES_BYTE_GROUP_SIZE, 1));
        spaceGroupSizeSpinner.setValue(preferences.getInt(DeltaHexFileEditor.PREFERENCES_SPACE_GROUP_SIZE, 0));

        // Mode
        ViewMode viewMode = ViewMode
                .valueOf(preferences.getValue(DeltaHexFileEditor.PREFERENCES_VIEW_MODE, ViewMode.DUAL.name()));
        viewModeComboBox.setSelectedIndex(viewMode.ordinal());
        CodeType codeType = CodeType.valueOf(
                preferences.getValue(DeltaHexFileEditor.PREFERENCES_CODE_TYPE, CodeType.HEXADECIMAL.name()));
        codeTypeComboBox.setSelectedIndex(codeType.ordinal());
        showNonprintableCharactersCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_SHOW_UNPRINTABLES, true));
        codeColorizationCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_CODE_COLORIZATION, true));
        showValuesPanelCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_SHOW_VALUES_PANEL, true));
        memoryModeComboBox.setSelectedIndex(
                preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_MEMORY_DELTA_MODE, true) ? 0 : 1);

        // Decoration
        CodeArea.BackgroundMode backgroundMode = CodeArea.BackgroundMode.valueOf(preferences
                .getValue(DeltaHexFileEditor.PREFERENCES_BACKGROUND_MODE, CodeArea.BackgroundMode.STRIPPED.name()));
        backgroundModeComboBox.setSelectedIndex(backgroundMode.ordinal());
        lineNumbersBackgroundCheckBox.setSelected(
                preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_PAINT_LINE_NUMBERS_BACKGROUND, true));
        decoratorHeaderLineCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_DECORATION_HEADER_LINE, true));
        decoratorPreviewLineCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_DECORATION_PREVIEW_LINE, true));
        decoratorBoxCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_DECORATION_BOX, false));
        decoratorLineNumLineCheckBox
                .setSelected(preferences.getBoolean(DeltaHexFileEditor.PREFERENCES_DECORATION_LINENUM_LINE, true));
        HexCharactersCase hexCharactersCase = HexCharactersCase.valueOf(preferences
                .getValue(DeltaHexFileEditor.PREFERENCES_HEX_CHARACTERS_CASE, HexCharactersCase.UPPER.name()));
        hexCharactersModeComboBox.setSelectedIndex(hexCharactersCase.ordinal());
        PositionCodeType positionCodeType = PositionCodeType.valueOf(preferences
                .getValue(DeltaHexFileEditor.PREFERENCES_POSITION_CODE_TYPE, PositionCodeType.HEXADECIMAL.name()));
        positionCodeTypeComboBox.setSelectedIndex(positionCodeType.ordinal());

        // Font
        Boolean useDefaultFont = Boolean.valueOf(
                preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_DEFAULT, Boolean.toString(true)));
        useDefaultFontCheckBox.setSelected(useDefaultFont);

        String value;
        Map<TextAttribute, Object> attribs = new HashMap<>();
        value = preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_FAMILY, null);
        if (value != null) {
            attribs.put(TextAttribute.FAMILY, value);
        }
        value = preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_SIZE, null);
        if (value != null) {
            attribs.put(TextAttribute.SIZE, new Integer(value).floatValue());
        }
        if (Boolean.valueOf(preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_UNDERLINE, null))) {
            attribs.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_LOW_ONE_PIXEL);
        }
        if (Boolean.valueOf(preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_STRIKETHROUGH, null))) {
            attribs.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
        }
        if (Boolean.valueOf(preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_STRONG, null))) {
            attribs.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
        }
        if (Boolean.valueOf(preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_ITALIC, null))) {
            attribs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
        }
        if (Boolean.valueOf(preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_SUBSCRIPT, null))) {
            attribs.put(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB);
        }
        if (Boolean.valueOf(preferences.getValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_SUPERSCRIPT, null))) {
            attribs.put(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER);
        }
        Font derivedFont = deltaHexFont.deriveFont(attribs);
        if (derivedFont != null) {
            deltaHexFont = derivedFont;
        }
        updateFontTextField();
    }

    public void store() {
        // Layout
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_LINE_WRAPPING, wrapLineModeCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_BYTES_PER_LINE,
                (int) ((Integer) lineLengthSpinner.getValue()), 0);
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_SHOW_HEADER, showHeaderCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_HEADER_SPACE_TYPE,
                CodeAreaSpace.SpaceType.values()[headerSpaceComboBox.getSelectedIndex()].name());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_HEADER_SPACE,
                (int) ((Integer) headerSpaceSpinner.getValue()), 0);
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_SHOW_LINE_NUMBERS,
                showLineNumbersCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_SPACE_TYPE,
                CodeAreaSpace.SpaceType.values()[lineNumbersSpaceComboBox.getSelectedIndex()].name());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_SPACE,
                (Integer) lineNumbersSpaceSpinner.getValue(), 0);
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_LENGTH_TYPE,
                CodeAreaLineNumberLength.LineNumberType.values()[lineNumbersLengthComboBox.getSelectedIndex()]
                        .name());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_LINE_NUMBERS_LENGTH,
                (Integer) lineNumbersLengthSpinner.getValue(), 0);
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_BYTE_GROUP_SIZE,
                (Integer) byteGroupSizeSpinner.getValue(), 0);
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_SPACE_GROUP_SIZE,
                (Integer) spaceGroupSizeSpinner.getValue(), 0);

        // Mode
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_VIEW_MODE,
                ViewMode.values()[viewModeComboBox.getSelectedIndex()].name());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_CODE_TYPE,
                CodeType.values()[codeTypeComboBox.getSelectedIndex()].name());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_SHOW_UNPRINTABLES,
                showNonprintableCharactersCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_CODE_COLORIZATION,
                codeColorizationCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_SHOW_VALUES_PANEL,
                showValuesPanelCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_MEMORY_DELTA_MODE, isDeltaMemoryMode());

        // Decoration
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_BACKGROUND_MODE,
                CodeArea.BackgroundMode.values()[backgroundModeComboBox.getSelectedIndex()].name());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_PAINT_LINE_NUMBERS_BACKGROUND,
                lineNumbersBackgroundCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_DECORATION_HEADER_LINE,
                decoratorHeaderLineCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_DECORATION_PREVIEW_LINE,
                decoratorPreviewLineCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_DECORATION_BOX, decoratorBoxCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_DECORATION_LINENUM_LINE,
                decoratorLineNumLineCheckBox.isSelected());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_HEX_CHARACTERS_CASE,
                HexCharactersCase.values()[hexCharactersModeComboBox.getSelectedIndex()].name());
        preferences.setValue(DeltaHexFileEditor.PREFERENCES_POSITION_CODE_TYPE,
                PositionCodeType.values()[positionCodeTypeComboBox.getSelectedIndex()].name());

        // Font
        preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_DEFAULT,
                Boolean.toString(useDefaultFontCheckBox.isSelected()));

        Map<TextAttribute, ?> attribs = deltaHexFont.getAttributes();
        String value = (String) attribs.get(TextAttribute.FAMILY);
        if (value != null) {
            preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_FAMILY, value);
        } else {
            preferences.unsetValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_FAMILY);
        }
        Float fontSize = (Float) attribs.get(TextAttribute.SIZE);
        if (fontSize != null) {
            preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_SIZE,
                    Integer.toString((int) (float) fontSize));
        } else {
            preferences.unsetValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_SIZE);
        }
        preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_UNDERLINE, Boolean
                .toString(TextAttribute.UNDERLINE_LOW_ONE_PIXEL.equals(attribs.get(TextAttribute.UNDERLINE))));
        preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_STRIKETHROUGH,
                Boolean.toString(TextAttribute.STRIKETHROUGH_ON.equals(attribs.get(TextAttribute.STRIKETHROUGH))));
        preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_STRONG,
                Boolean.toString(TextAttribute.WEIGHT_BOLD.equals(attribs.get(TextAttribute.WEIGHT))));
        preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_ITALIC,
                Boolean.toString(TextAttribute.POSTURE_OBLIQUE.equals(attribs.get(TextAttribute.POSTURE))));
        preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_SUBSCRIPT,
                Boolean.toString(TextAttribute.SUPERSCRIPT_SUB.equals(attribs.get(TextAttribute.SUPERSCRIPT))));
        preferences.setValue(TextFontOptionsPanel.PREFERENCES_TEXT_FONT_SUPERSCRIPT,
                Boolean.toString(TextAttribute.SUPERSCRIPT_SUPER.equals(attribs.get(TextAttribute.SUPERSCRIPT))));
    }

    public void setFromCodeArea(CodeArea codeArea) {
        // Layout
        wrapLineModeCheckBox.setSelected(codeArea.isWrapMode());
        lineLengthSpinner.setValue(codeArea.getLineLength());
        showHeaderCheckBox.setSelected(codeArea.isShowHeader());
        headerSpaceComboBox.setSelectedIndex(codeArea.getHeaderSpaceType().ordinal());
        headerSpaceSpinner.setValue(codeArea.getHeaderSpaceSize());
        showLineNumbersCheckBox.setSelected(codeArea.isShowLineNumbers());
        lineNumbersSpaceComboBox.setSelectedIndex(codeArea.getLineNumberSpaceType().ordinal());
        lineNumbersSpaceSpinner.setValue(codeArea.getLineNumberSpaceSize());
        lineNumbersLengthComboBox.setSelectedIndex(codeArea.getLineNumberType().ordinal());
        lineNumbersLengthSpinner.setValue(codeArea.getLineNumberSpecifiedLength());
        byteGroupSizeSpinner.setValue(codeArea.getByteGroupSize());
        spaceGroupSizeSpinner.setValue(codeArea.getSpaceGroupSize());

        // Mode
        viewModeComboBox.setSelectedIndex(codeArea.getViewMode().ordinal());
        codeTypeComboBox.setSelectedIndex(codeArea.getCodeType().ordinal());
        showNonprintableCharactersCheckBox.setSelected(codeArea.isShowUnprintableCharacters());
        codeColorizationCheckBox.setSelected(
                ((HighlightNonAsciiCodeAreaPainter) codeArea.getPainter()).isNonAsciiHighlightingEnabled());
        memoryModeComboBox.setSelectedIndex(codeArea.getData() instanceof DeltaDocument ? 0 : 1);

        // Decoration
        backgroundModeComboBox.setSelectedIndex(codeArea.getBackgroundMode().ordinal());
        lineNumbersBackgroundCheckBox.setSelected(codeArea.isLineNumberBackground());
        setDecorationMode(codeArea.getDecorationMode());
        hexCharactersModeComboBox.setSelectedIndex(codeArea.getHexCharactersCase().ordinal());
        positionCodeTypeComboBox.setSelectedIndex(codeArea.getPositionCodeType().ordinal());

        // Font
        deltaHexFont = codeArea.getFont();
        updateFontTextField();
        useDefaultFontCheckBox.setSelected(deltaHexFont.equals(deltaHexDefaultFont));
    }

    public void applyToCodeArea(CodeArea codeArea) {
        // Layout
        codeArea.setWrapMode(wrapLineModeCheckBox.isSelected());
        codeArea.setLineLength((Integer) lineLengthSpinner.getValue());
        codeArea.setShowHeader(showHeaderCheckBox.isSelected());
        codeArea.setHeaderSpaceType(CodeAreaSpace.SpaceType.values()[headerSpaceComboBox.getSelectedIndex()]);
        codeArea.setHeaderSpaceSize((Integer) headerSpaceSpinner.getValue());
        codeArea.setShowLineNumbers(showLineNumbersCheckBox.isSelected());
        codeArea.setLineNumberSpaceType(
                CodeAreaSpace.SpaceType.values()[lineNumbersSpaceComboBox.getSelectedIndex()]);
        codeArea.setLineNumberSpaceSize((Integer) lineNumbersSpaceSpinner.getValue());
        codeArea.setLineNumberType(
                CodeAreaLineNumberLength.LineNumberType.values()[lineNumbersLengthComboBox.getSelectedIndex()]);
        codeArea.setLineNumberSpecifiedLength((Integer) lineNumbersLengthSpinner.getValue());
        codeArea.setByteGroupSize((Integer) byteGroupSizeSpinner.getValue());
        codeArea.setSpaceGroupSize((Integer) spaceGroupSizeSpinner.getValue());

        // Mode
        codeArea.setViewMode(ViewMode.values()[viewModeComboBox.getSelectedIndex()]);
        codeArea.setCodeType(CodeType.values()[codeTypeComboBox.getSelectedIndex()]);
        codeArea.setShowUnprintableCharacters(showNonprintableCharactersCheckBox.isSelected());
        ((HighlightNonAsciiCodeAreaPainter) codeArea.getPainter())
                .setNonAsciiHighlightingEnabled(codeColorizationCheckBox.isSelected());
        // Memory mode handled from outside by isDeltaMemoryMode() method, worth fixing?

        // Decoration
        codeArea.setBackgroundMode(CodeArea.BackgroundMode.values()[backgroundModeComboBox.getSelectedIndex()]);
        codeArea.setLineNumberBackground(lineNumbersBackgroundCheckBox.isSelected());
        codeArea.setDecorationMode(getDecorationMode());
        codeArea.setHexCharactersCase(HexCharactersCase.values()[hexCharactersModeComboBox.getSelectedIndex()]);
        codeArea.setPositionCodeType(PositionCodeType.values()[positionCodeTypeComboBox.getSelectedIndex()]);

        // Font
        if (useDefaultFontCheckBox.isSelected()) {
            codeArea.setFont(deltaHexDefaultFont);
        } else {
            codeArea.setFont(deltaHexFont);
        }
    }

    public boolean isShowValuesPanel() {
        return showValuesPanelCheckBox.isSelected();
    }

    public void setShowValuesPanel(boolean flag) {
        showValuesPanelCheckBox.setSelected(flag);
    }

    private int getDecorationMode() {
        return (decoratorHeaderLineCheckBox.isSelected() ? CodeArea.DECORATION_HEADER_LINE : 0)
                + (decoratorPreviewLineCheckBox.isSelected() ? CodeArea.DECORATION_PREVIEW_LINE : 0)
                + (decoratorBoxCheckBox.isSelected() ? CodeArea.DECORATION_BOX : 0)
                + (decoratorLineNumLineCheckBox.isSelected() ? CodeArea.DECORATION_LINENUM_LINE : 0);
    }

    private void setDecorationMode(int decorationMode) {
        decoratorHeaderLineCheckBox.setSelected((decorationMode & CodeArea.DECORATION_HEADER_LINE) > 0);
        decoratorLineNumLineCheckBox.setSelected((decorationMode & CodeArea.DECORATION_LINENUM_LINE) > 0);
        decoratorPreviewLineCheckBox.setSelected((decorationMode & CodeArea.DECORATION_PREVIEW_LINE) > 0);
        decoratorBoxCheckBox.setSelected((decorationMode & CodeArea.DECORATION_BOX) > 0);
    }

    public boolean isDeltaMemoryMode() {
        return memoryModeComboBox.getSelectedIndex() == 0;
    }

    boolean valid() {
        // TODO check whether form is consistent and complete
        return true;
    }

    private void updateFontTextField() {
        int fontStyle = deltaHexFont.getStyle();
        String fontStyleName;
        if ((fontStyle & (Font.BOLD + Font.ITALIC)) == Font.BOLD + Font.ITALIC) {
            fontStyleName = "Bold Italic";
        } else if ((fontStyle & Font.BOLD) > 0) {
            fontStyleName = "Bold";
        } else if ((fontStyle & Font.ITALIC) > 0) {
            fontStyleName = "Italic";
        } else {
            fontStyleName = "Plain";
        }
        fontTextField.setText(
                deltaHexFont.getFamily() + " " + String.valueOf(deltaHexFont.getSize()) + " " + fontStyleName);
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JComboBox<String> backgroundModeComboBox;
    private javax.swing.JLabel backgroundModeLabel;
    private javax.swing.JLabel byteGroupSizeLabel;
    private javax.swing.JSpinner byteGroupSizeSpinner;
    private javax.swing.JLabel categoriesLabel;
    private javax.swing.JList<CategoryItem> categoriesList;
    private javax.swing.JScrollPane categoriesScrollPane;
    private javax.swing.JCheckBox codeColorizationCheckBox;
    private javax.swing.JComboBox<String> codeTypeComboBox;
    private javax.swing.JLabel codeTypeScrollModeLabel;
    private javax.swing.JLabel colorsLabel;
    private javax.swing.JPanel decorationPanel;
    private javax.swing.JCheckBox decoratorBoxCheckBox;
    private javax.swing.JCheckBox decoratorHeaderLineCheckBox;
    private javax.swing.JCheckBox decoratorLineNumLineCheckBox;
    private javax.swing.JCheckBox decoratorPreviewLineCheckBox;
    private javax.swing.JLabel fontLabel;
    private javax.swing.JTextField fontTextField;
    private javax.swing.JPanel fontsAndColorPanel;
    private javax.swing.JPanel headerPanel;
    private javax.swing.JComboBox<String> headerSpaceComboBox;
    private javax.swing.JLabel headerSpaceLabel;
    private javax.swing.JSpinner headerSpaceSpinner;
    private javax.swing.JComboBox<String> hexCharactersModeComboBox;
    private javax.swing.JLabel hexCharactersModeLabel;
    private javax.swing.JPanel layoutPanel;
    private javax.swing.JLabel lineLengthLabel;
    private javax.swing.JSpinner lineLengthSpinner;
    private javax.swing.JLabel lineNumberLengthLabel;
    private javax.swing.JLabel lineNumberSpaceLabel;
    private javax.swing.JCheckBox lineNumbersBackgroundCheckBox;
    private javax.swing.JComboBox<String> lineNumbersLengthComboBox;
    private javax.swing.JSpinner lineNumbersLengthSpinner;
    private javax.swing.JPanel lineNumbersPanel;
    private javax.swing.JComboBox<String> lineNumbersSpaceComboBox;
    private javax.swing.JSpinner lineNumbersSpaceSpinner;
    private javax.swing.JPanel linesPanel;
    private javax.swing.JScrollPane mainPane;
    private javax.swing.JComboBox<String> memoryModeComboBox;
    private javax.swing.JLabel memoryModeLabel;
    private javax.swing.JPanel modePanel;
    private javax.swing.JComboBox<String> positionCodeTypeComboBox;
    private javax.swing.JLabel positionCodeTypeLabel;
    private javax.swing.JButton selectFontButton;
    private javax.swing.JCheckBox showHeaderCheckBox;
    private javax.swing.JCheckBox showLineNumbersCheckBox;
    private javax.swing.JCheckBox showNonprintableCharactersCheckBox;
    private javax.swing.JCheckBox showValuesPanelCheckBox;
    private javax.swing.JLabel spaceGroupSizeLabel;
    private javax.swing.JSpinner spaceGroupSizeSpinner;
    private javax.swing.JCheckBox useDefaultFontCheckBox;
    private javax.swing.JComboBox<String> viewModeComboBox;
    private javax.swing.JLabel viewModeScrollModeLabel;
    private javax.swing.JCheckBox wrapLineModeCheckBox;
    // End of variables declaration//GEN-END:variables

    private static class CategoryItem {

        String categoryName;
        JPanel categoryPanel;

        public CategoryItem(String categoryName, JPanel categoryPanel) {
            this.categoryName = categoryName;
            this.categoryPanel = categoryPanel;
        }

        public String getCategoryName() {
            return categoryName;
        }

        public JPanel getCategoryPanel() {
            return categoryPanel;
        }
    }
}