org.qedeq.gui.se.pane.PluginPreferencesDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.qedeq.gui.se.pane.PluginPreferencesDialog.java

Source

/* This file is part of the project "Hilbert II" - http://www.qedeq.org
 *
 * Copyright 2000-2013,  Michael Meyling <mime@qedeq.org>.
 *
 * "Hilbert II" is free software; you can redistribute
 * it and/or modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * 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
 * GNU General Public License for more details.
 */

package org.qedeq.gui.se.pane;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;

import org.qedeq.base.io.Parameters;
import org.qedeq.base.trace.Trace;
import org.qedeq.gui.se.util.GuiHelper;
import org.qedeq.kernel.bo.logic.model.FourDynamicModel;
import org.qedeq.kernel.bo.logic.model.SixDynamicModel;
import org.qedeq.kernel.bo.logic.model.ThreeDynamicModel;
import org.qedeq.kernel.bo.logic.model.UnaryDynamicModel;
import org.qedeq.kernel.bo.module.PluginBo;
import org.qedeq.kernel.bo.service.heuristic.DynamicHeuristicCheckerPlugin;
import org.qedeq.kernel.bo.service.latex.Qedeq2LatexPlugin;
import org.qedeq.kernel.bo.service.logic.SimpleProofFinderPlugin;
import org.qedeq.kernel.bo.service.unicode.Qedeq2UnicodeTextPlugin;
import org.qedeq.kernel.bo.service.unicode.Qedeq2Utf8Plugin;
import org.qedeq.kernel.se.common.Plugin;

import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

/**
 * Configures the plugin parameters.
 *
 * @author  Michael Meyling
 */

public class PluginPreferencesDialog extends JDialog {

    /** This class. */
    private static final Class CLASS = PluginPreferencesDialog.class;

    /** Text field for default language of QEDEQ to UTF-8 show plugin. */
    private JTextField qedeq2Utf8ShowLanguageTF;

    /** Checkbox for info parameter of QEDEQ to UTF-8 show plugin. */
    private JCheckBox qedeq2Utf8ShowInfoCB;

    /** Text field for maximum column of QEDEQ to UTF-8 show plugin. */
    private JTextField qedeq2Utf8ShowMaximumColumnTF;

    /** Checkbox for info parameter of QEDEQ to LaTeX plugin. */
    private JCheckBox qedeq2LatexInfoCB;

    /** Checkbox for brief parameter of QEDEQ to LaTeX plugin. */
    private JCheckBox qedeq2LatexBriefCB;

    /** Checkbox for info parameter of QEDEQ to UTF-8 plugin. */
    private JCheckBox qedeq2Utf8InfoCB;

    /** Text field for maximum column of QEDEQ to UTF-8 plugin. */
    private JTextField qedeq2Utf8MaximumColumnTF;

    /** Checkbox for brief parameter of QEDEQ to UTF-8 plugin. */
    private JCheckBox qedeq2Utf8BriefCB;

    /** Plugin for converting QEDEQ modules into LaTeX. */
    private final Qedeq2LatexPlugin qedeq2latex;

    /** Plugin for converting QEDEQ modules into UTF-8 text. */
    private final Qedeq2Utf8Plugin qedeq2utf8;

    /** Plugin for showing QEDEQ modules as UTF-8 text. */
    private final Qedeq2UnicodeTextPlugin qedeq2utf8Show;

    /** Plugin for finding simple propositional calculus proofs. */
    private final SimpleProofFinderPlugin proofFinder;

    /** Plugin for checking formulas with the help of a dynamically calculated static model. */
    private DynamicHeuristicCheckerPlugin dynamicHeuristicChecker;

    /** Class string for dynamic static model. */
    private String dynamicHeuristicCheckerModel = "";

    /** Text field for maximum proof length of proof finder plugin. */
    private JTextField proofFinderMaximumProofLengthTF;

    /** Text field for number of additional propositional variables for substitution. */
    private JTextField proofFinderExtraVarsTF;

    /** Text field for number for order of substitution. */
    private JTextField proofFinderPropositionVariableOrderTF;

    /** Text field for number for weight of substitution. */
    private JTextField proofFinderPropositionVariableWeightTF;

    /** Text field for number for order of substitution. */
    private JTextField proofFinderPartFormulaOrderTF;

    /** Text field for number for weight of substitution. */
    private JTextField proofFinderPartFormulaWeightTF;

    /** Text field for number for order of substitution. */
    private JTextField proofFinderDisjunctionOrderTF;

    /** Text field for number for weight of substitution. */
    private JTextField proofFinderDisjunctionWeightTF;

    /** Text field for number for order of substitution. */
    private JTextField proofFinderImplicationOrderTF;

    /** Text field for number for weight of substitution. */
    private JTextField proofFinderImplicationWeightTF;

    /** Text field for number for order of substitution. */
    private JTextField proofFinderNegationOrderTF;

    /** Text field for number for weight of substitution. */
    private JTextField proofFinderNegationWeightTF;

    /** Text field for number for order of substitution. */
    private JTextField proofFinderConjunctionOrderTF;

    /** Text field for number for weight of substitution. */
    private JTextField proofFinderConjunctionWeightTF;

    /** Text field for number for order of substitution. */
    private JTextField proofFinderEquivalenceOrderTF;

    /** Text field for number for weight of substitution. */
    private JTextField proofFinderEquivalenceWeightTF;

    /** Text field for number of new proof lines before a new log entry. */
    private JTextField proofFinderLogFrequenceTF;

    /** Text field for sequence of formula numbers we want to skip. */
    private JTextField proofFinderSkipFormulasTF;

    /** Here are the tabs. */
    private JTabbedPane tabbedPane;

    /** Here are the creators of class {@link PluginGuiPreferencesCreator}. */
    private List creators;

    /**
     * Creates new Panel.
     *
     * @param   parent  Parent frame.
     */
    public PluginPreferencesDialog(final JFrame parent) {
        super(parent, "Plugin Preferences");
        final String method = "Constructor";
        Trace.begin(CLASS, this, method);
        try {
            qedeq2latex = new Qedeq2LatexPlugin();
            qedeq2utf8 = new Qedeq2Utf8Plugin();
            qedeq2utf8Show = new Qedeq2UnicodeTextPlugin();
            dynamicHeuristicChecker = new DynamicHeuristicCheckerPlugin();
            proofFinder = new SimpleProofFinderPlugin();
            creators = new ArrayList();
            setModal(true);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setupView();
            updateView();
        } catch (RuntimeException e) {
            Trace.fatal(CLASS, this, "Initalization of PreferencesDialog failed.", method, e);
            throw e;
        } finally {
            Trace.end(CLASS, this, method);
        }
    }

    /**
     * Assembles the GUI components of the panel.
     */
    public final void setupView() {
        final JPanel content = new JPanel(new BorderLayout());
        getContentPane().add(content);

        tabbedPane = new JTabbedPane();
        tabbedPane.setOpaque(false);
        creators.add(qedeq2Utf8ShowConfig(qedeq2utf8Show));
        creators.add(qedeq2LatexConfig(qedeq2latex));
        creators.add(qedeq2Utf8Config(qedeq2utf8));
        //        creators.add(heuristicCheckerConfig(heuristicChecker));
        creators.add(dynamicHeuristicCheckerConfig(dynamicHeuristicChecker));
        creators.add(proofFinderConfig(proofFinder));
        final Iterator iter = creators.iterator();
        while (iter.hasNext()) {
            PluginGuiPreferencesCreator creator = (PluginGuiPreferencesCreator) iter.next();
            tabbedPane.addTab(creator.getName(),
                    creator.create(QedeqGuiConfig.getInstance().getServiceEntries(creator.getPlugin())));
        }

        //        tabbedPane.setBorder(GuiHelper.getEmptyBorder());
        tabbedPane.setBorder(new CompoundBorder(new EmptyBorder(0, 10, 10, 10), tabbedPane.getBorder()));
        content.add(tabbedPane, BorderLayout.CENTER);

        content.add(GuiHelper.addSpaceAndAlignRight(buildButtonPanel()), BorderLayout.SOUTH);

        // let the container calculate the ideal size
        this.pack();

        final Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        int width = getWidth();
        if (2 * width < screenSize.width) {
            width = 2 * width;
        }
        setBounds((screenSize.width - getWidth()) / 2, (screenSize.height - getHeight()) / 2, width, getHeight());
    }

    /**
     * Assembles settings for {@link Qedeq2LatexPlugin}.
     *
     * @param   plugin  The transformation plugin.
     * @return  Created panel.
     */
    private PluginGuiPreferencesCreator qedeq2LatexConfig(final PluginBo plugin) {
        return new PluginGuiPreferencesCreator(plugin) {
            JComponent create(final Parameters parameters) {
                FormLayout layout = new FormLayout("left:pref, 5dlu, fill:pref:grow"); // columns

                DefaultFormBuilder builder = new DefaultFormBuilder(layout);
                builder.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
                builder.getPanel().setOpaque(false);

                qedeq2LatexInfoCB = new JCheckBox(" Also write reference labels (makes it easier for authors)",
                        parameters.getBoolean("info"));
                builder.append(qedeq2LatexInfoCB);

                builder.nextLine();
                qedeq2LatexBriefCB = new JCheckBox(" Leave out main text entries. Creates a very brief document.",
                        parameters.getBoolean("brief"));
                builder.append(qedeq2LatexBriefCB);

                return GuiHelper.addSpaceAndTitle(builder.getPanel(), plugin.getServiceDescription());
            }
        };
    }

    /**
     * Assembles settings for {@link Qedeq2Utf8Plugin}.
     *
     * @param   plugin  The transformation plugin.
     * @return  Created panel.
     */
    private PluginGuiPreferencesCreator qedeq2Utf8Config(final PluginBo plugin) {
        return new PluginGuiPreferencesCreator(plugin) {
            JComponent create(final Parameters parameters) {
                FormLayout layout = new FormLayout("left:pref, 5dlu, fill:50dlu, fill:pref:grow"); // columns

                DefaultFormBuilder builder = new DefaultFormBuilder(layout);
                builder.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
                builder.getPanel().setOpaque(false);

                qedeq2Utf8InfoCB = new JCheckBox(" Also write reference labels (makes it easier for authors)",
                        parameters.getBoolean("info"));
                builder.append(qedeq2Utf8InfoCB, 4);

                builder.nextLine();
                builder.append("Maximum row length");
                qedeq2Utf8MaximumColumnTF = new JTextField(parameters.getString("maximumColumn"));
                qedeq2Utf8MaximumColumnTF.setToolTipText(
                        "After this character number the line is broken." + "0 means no break at all.");
                builder.append(qedeq2Utf8MaximumColumnTF);

                builder.nextLine();
                qedeq2Utf8BriefCB = new JCheckBox(" Leave out main text entries. Creates a very brief document.",
                        parameters.getBoolean("brief"));
                builder.append(qedeq2Utf8BriefCB);

                return GuiHelper.addSpaceAndTitle(builder.getPanel(), plugin.getServiceDescription());
            }
        };
    }

    /**
     * Assembles settings for {@link Qedeq2Utf8TextPlugin}.
     *
     * @param   plugin  The transformation plugin.
     * @return  Created panel.
     */
    private PluginGuiPreferencesCreator qedeq2Utf8ShowConfig(final PluginBo plugin) {
        return new PluginGuiPreferencesCreator(plugin) {
            JComponent create(final Parameters parameters) {
                FormLayout layout = new FormLayout("left:pref, 5dlu, fill:50dlu, fill:pref:grow"); // columns

                DefaultFormBuilder builder = new DefaultFormBuilder(layout);
                builder.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
                builder.getPanel().setOpaque(false);

                builder.append("Default language");
                qedeq2Utf8ShowLanguageTF = new JTextField(parameters.getString("language"));
                qedeq2Utf8ShowLanguageTF.setToolTipText("Default language for showing module contents.");
                builder.append(qedeq2Utf8ShowLanguageTF);

                builder.nextLine();
                qedeq2Utf8ShowInfoCB = new JCheckBox(" Also write reference labels (makes it easier for authors)",
                        parameters.getBoolean("info"));
                builder.append(qedeq2Utf8ShowInfoCB, 4);

                builder.nextLine();
                builder.append("Maximum row length");
                qedeq2Utf8ShowMaximumColumnTF = new JTextField(parameters.getString("maximumColumn"));
                qedeq2Utf8ShowMaximumColumnTF.setToolTipText(
                        "After this character number the line is broken." + "0 means no break at all.");
                builder.append(qedeq2Utf8ShowMaximumColumnTF);

                return GuiHelper.addSpaceAndTitle(builder.getPanel(), plugin.getServiceDescription());
            }
        };
    }

    /**
     * Assembles settings for {@link DynamicHeuristicCheckerPlugin}.
     *
     * @param   plugin  The transformation plugin.
     * @return  Created panel.
     */
    private PluginGuiPreferencesCreator dynamicHeuristicCheckerConfig(final PluginBo plugin) {
        return new PluginGuiPreferencesCreator(plugin) {
            JComponent create(final Parameters parameters) {
                FormLayout layout = new FormLayout("left:pref, 5dlu, fill:pref:grow", // columns
                        "top:pref:grow, top:pref:grow, top:pref:grow"); // rows

                DefaultFormBuilder builder = new DefaultFormBuilder(layout);
                builder.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
                builder.getPanel().setOpaque(false);

                final ThreeDynamicModel modelThree = new ThreeDynamicModel();
                final FourDynamicModel modelFour = new FourDynamicModel();
                final SixDynamicModel modelSix = new SixDynamicModel();

                final ButtonGroup dynamicHeuristicCheckerModelBG = new ButtonGroup();

                final UnaryDynamicModel modelOne = new UnaryDynamicModel();
                dynamicHeuristicCheckerModel = parameters.getString("model");
                final ActionListener modelSelectionListener = new ActionListener() {
                    public void actionPerformed(final ActionEvent e) {
                        dynamicHeuristicCheckerModel = e.getActionCommand();
                    }
                };

                // model with one element
                {
                    final JRadioButton dynamicHeuristicCheckerOneModelRB = new JRadioButton("One");
                    if (dynamicHeuristicCheckerModel.equals(modelOne.getClass().getName())) {
                        dynamicHeuristicCheckerOneModelRB.setSelected(true);
                    }
                    dynamicHeuristicCheckerOneModelRB.setActionCommand(modelOne.getClass().getName());
                    dynamicHeuristicCheckerOneModelRB.addActionListener(modelSelectionListener);
                    dynamicHeuristicCheckerModelBG.add(dynamicHeuristicCheckerOneModelRB);
                    builder.append(dynamicHeuristicCheckerOneModelRB);
                    builder.append(getDescription(modelOne.getDescription()));
                }

                // model with three elements
                {
                    final JRadioButton dynamicHeuristicCheckerThreeModelRB = new JRadioButton("Three");
                    if (dynamicHeuristicCheckerModel.equals(modelThree.getClass().getName())) {
                        dynamicHeuristicCheckerThreeModelRB.setSelected(true);
                    }
                    dynamicHeuristicCheckerThreeModelRB.setActionCommand(modelThree.getClass().getName());
                    dynamicHeuristicCheckerThreeModelRB.addActionListener(modelSelectionListener);
                    dynamicHeuristicCheckerModelBG.add(dynamicHeuristicCheckerThreeModelRB);
                    builder.append(dynamicHeuristicCheckerThreeModelRB);
                    builder.append(getDescription(modelThree.getDescription()));
                }

                // model with four elements
                {
                    final JRadioButton dynamicHeuristicCheckerFourModelRB = new JRadioButton("Four");
                    if (dynamicHeuristicCheckerModel.equals(modelFour.getClass().getName())) {
                        dynamicHeuristicCheckerFourModelRB.setSelected(true);
                    }
                    dynamicHeuristicCheckerFourModelRB.setActionCommand(modelFour.getClass().getName());
                    dynamicHeuristicCheckerFourModelRB.addActionListener(modelSelectionListener);
                    dynamicHeuristicCheckerModelBG.add(dynamicHeuristicCheckerFourModelRB);
                    builder.append(dynamicHeuristicCheckerFourModelRB);
                    builder.append(getDescription(modelFour.getDescription()));
                }

                // model with five elements
                {
                    final JRadioButton dynamicHeuristicCheckerSixModelRB = new JRadioButton("Six");
                    if (dynamicHeuristicCheckerModel.equals(modelSix.getClass().getName())) {
                        dynamicHeuristicCheckerSixModelRB.setSelected(true);
                    }
                    dynamicHeuristicCheckerSixModelRB.setActionCommand(modelSix.getClass().getName());
                    dynamicHeuristicCheckerSixModelRB.addActionListener(modelSelectionListener);
                    dynamicHeuristicCheckerModelBG.add(dynamicHeuristicCheckerSixModelRB);
                    builder.append(dynamicHeuristicCheckerSixModelRB);
                    builder.append(getDescription(modelSix.getDescription()));
                }

                return GuiHelper.addSpaceAndTitle(builder.getPanel(), plugin.getServiceDescription());
            }
        };
    }

    /**
     * Assembles settings for {@link ProofFinderPlugin}.
     *
     * @param   plugin  The transformation plugin.
     * @return  Created panel.
     */
    private PluginGuiPreferencesCreator proofFinderConfig(final PluginBo plugin) {
        return new PluginGuiPreferencesCreator(plugin) {
            JComponent create(final Parameters parameters) {
                FormLayout layout = new FormLayout("left:pref, 5dlu, fill:50dlu, 5dlu, fill:50dlu, fill:pref:grow"); // columns

                DefaultFormBuilder builder = new DefaultFormBuilder(layout);
                builder.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
                builder.getPanel().setOpaque(false);

                builder.append("Maximum proof lines");
                proofFinderMaximumProofLengthTF = new JTextField(parameters.getString("maximumProofLines"));
                proofFinderMaximumProofLengthTF.setToolTipText("After this proof line number we abandom."
                        + " the search. This is not the maximum proof line length of the final proof but the"
                        + " but the maximum number of all generated proof lines.");
                builder.append(proofFinderMaximumProofLengthTF);
                builder.nextLine();

                builder.append("Log frequence");
                proofFinderLogFrequenceTF = new JTextField(parameters.getString("logFrequence"));
                proofFinderLogFrequenceTF
                        .setToolTipText("After this number of new proof lines we" + " create a logging output.");
                builder.append(proofFinderLogFrequenceTF);
                builder.nextLine();

                builder.append("Skip formulas");
                proofFinderSkipFormulasTF = new JTextField(parameters.getString("skipFormulas"));
                proofFinderSkipFormulasTF.setToolTipText("Skip these list of formula numbers (see log output)."
                        + " This a comma separated list of numbers.");
                builder.append(proofFinderSkipFormulasTF);
                builder.nextLine();

                proofFinderExtraVarsTF = new JTextField(parameters.getString("extraVars"));
                builder.append("Extra proposition variables");
                builder.append(proofFinderExtraVarsTF);
                proofFinderExtraVarsTF.setToolTipText("We use these number of extra proposition variables"
                        + " beside the ones we have in our initial formulas and the goal formula.");
                builder.nextLine();

                builder.appendSeparator();
                builder.append("Operator");
                builder.append("Order");
                builder.append("Weight");
                builder.nextLine();

                builder.append("Proposition variable");
                proofFinderPropositionVariableOrderTF = new JTextField(
                        parameters.getString("propositionVariableOrder"));
                builder.append(proofFinderPropositionVariableOrderTF);
                proofFinderPropositionVariableWeightTF = new JTextField(
                        parameters.getString("propositionVariableWeight"));
                builder.append(proofFinderPropositionVariableWeightTF);
                builder.nextLine();

                builder.append("Part formula");
                proofFinderPartFormulaOrderTF = new JTextField(parameters.getString("partFormulaOrder"));
                builder.append(proofFinderPartFormulaOrderTF);
                proofFinderPartFormulaWeightTF = new JTextField(parameters.getString("partFormulaWeight"));
                builder.append(proofFinderPartFormulaWeightTF);
                builder.nextLine();

                builder.append("Disjunction");
                proofFinderDisjunctionOrderTF = new JTextField(parameters.getString("disjunctionOrder"));
                builder.append(proofFinderDisjunctionOrderTF);
                proofFinderDisjunctionWeightTF = new JTextField(parameters.getString("disjunctionWeight"));
                builder.append(proofFinderDisjunctionWeightTF);
                builder.nextLine();

                builder.append("Implication");
                proofFinderImplicationOrderTF = new JTextField(parameters.getString("implicationOrder"));
                builder.append(proofFinderImplicationOrderTF);
                proofFinderImplicationWeightTF = new JTextField(parameters.getString("implicationWeight"));
                builder.append(proofFinderImplicationWeightTF);
                builder.nextLine();

                builder.append("Negation");
                proofFinderNegationOrderTF = new JTextField(parameters.getString("negationOrder"));
                builder.append(proofFinderNegationOrderTF);
                proofFinderNegationWeightTF = new JTextField(parameters.getString("negationWeight"));
                builder.append(proofFinderNegationWeightTF);
                builder.nextLine();

                builder.append("Conjunction");
                proofFinderConjunctionOrderTF = new JTextField(parameters.getString("conjunctionOrder"));
                builder.append(proofFinderConjunctionOrderTF);
                proofFinderConjunctionWeightTF = new JTextField(parameters.getString("conjunctionWeight"));
                builder.append(proofFinderConjunctionWeightTF);
                builder.nextLine();

                builder.append("Equivalence");
                proofFinderEquivalenceOrderTF = new JTextField(parameters.getString("equivalenceOrder"));
                builder.append(proofFinderEquivalenceOrderTF);
                proofFinderEquivalenceWeightTF = new JTextField(parameters.getString("equivalenceWeight"));
                builder.append(proofFinderEquivalenceWeightTF);
                builder.nextLine();

                return GuiHelper.addSpaceAndTitle(builder.getPanel(), plugin.getServiceDescription());
            }
        };
    }

    private JTextArea getDescription(final String text) {
        JTextArea description = new JTextArea(text);
        description.setEditable(false);
        description.setLineWrap(true);
        description.setWrapStyleWord(true);
        return description;
    }

    /**
     * Create button panel with "OK" and "Cancel".
     *
     * @return  Button panel.
     */
    private JPanel buildButtonPanel() {
        ButtonBarBuilder bbuilder = ButtonBarBuilder.createLeftToRightBuilder();

        JButton def = new JButton("Default");
        def.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent actionEvent) {
                final int i = tabbedPane.getSelectedIndex();
                PluginGuiPreferencesCreator creator = (PluginGuiPreferencesCreator) creators.get(i);
                tabbedPane.setComponentAt(i, creator.createDefault());
            }
        });
        def.setToolTipText("Reset to default values for plugin currently displayed.");

        JButton ok = new JButton("OK");
        ok.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent actionEvent) {
                PluginPreferencesDialog.this.save();
                PluginPreferencesDialog.this.dispose();
            }
        });

        JButton cancel = new JButton("Cancel");
        cancel.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent actionEvent) {
                PluginPreferencesDialog.this.dispose();
            }
        });
        bbuilder.addGriddedButtons(new JButton[] { def });
        bbuilder.addUnrelatedGap();
        bbuilder.addUnrelatedGap();
        bbuilder.addGriddedButtons(new JButton[] { cancel, ok });

        final JPanel buttons = bbuilder.getPanel();
        return buttons;
    }

    /**
     * Update from model.
     */
    public void updateView() {
        invalidate();
        repaint();
    }

    void save() {
        try {
            {
                final Plugin plugin = qedeq2utf8Show;
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "language",
                        qedeq2Utf8ShowLanguageTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "info", qedeq2Utf8ShowInfoCB.isSelected());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "maximumColumn",
                        qedeq2Utf8ShowMaximumColumnTF.getText());
            }
            {
                final Plugin plugin = qedeq2latex;
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "info", qedeq2LatexInfoCB.isSelected());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "brief", qedeq2LatexBriefCB.isSelected());
            }
            {
                final Plugin plugin = qedeq2utf8;
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "info", qedeq2Utf8InfoCB.isSelected());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "maximumColumn",
                        qedeq2Utf8MaximumColumnTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "brief", qedeq2Utf8BriefCB.isSelected());
            }
            {
                final Plugin plugin = dynamicHeuristicChecker;
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "model", dynamicHeuristicCheckerModel);
            }
            {
                final Plugin plugin = proofFinder;
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "maximumProofLines",
                        proofFinderMaximumProofLengthTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "logFrequence",
                        proofFinderLogFrequenceTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "skipFormulas",
                        proofFinderSkipFormulasTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "extraVars",
                        proofFinderExtraVarsTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "propositionVariableOrder",
                        proofFinderPropositionVariableOrderTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "propositionVariableWeight",
                        proofFinderPropositionVariableWeightTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "partFormulaOrder",
                        proofFinderPartFormulaOrderTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "partFormulaWeight",
                        proofFinderPartFormulaWeightTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "disjunctionOrder",
                        proofFinderDisjunctionOrderTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "disjunctionWeight",
                        proofFinderDisjunctionWeightTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "implicationOrder",
                        proofFinderImplicationOrderTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "implicationWeight",
                        proofFinderImplicationWeightTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "negationOrder",
                        proofFinderNegationOrderTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "negationWeight",
                        proofFinderNegationWeightTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "conjunctionOrder",
                        proofFinderConjunctionOrderTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "conjunctionWeight",
                        proofFinderConjunctionWeightTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "equivalenceOrder",
                        proofFinderEquivalenceOrderTF.getText());
                QedeqGuiConfig.getInstance().setServiceKeyValue(plugin, "equivalenceWeight",
                        proofFinderEquivalenceWeightTF.getText());
            }
        } catch (RuntimeException e) {
            Trace.fatal(CLASS, this, "save", "couldn't save preferences", e);
            JOptionPane.showMessageDialog(this, e.toString(), "Error", JOptionPane.ERROR_MESSAGE);
        }
        try {
            QedeqGuiConfig.getInstance().store();
        } catch (IOException e) {
            Trace.fatal(CLASS, this, "save", "couldn't save preferences", e);
            JOptionPane.showMessageDialog(this, "Couldn't save preferences", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * This class is a basic creator for tabbed content.
     */
    private abstract class PluginGuiPreferencesCreator {

        /** We work for this plugin. */
        private final PluginBo plugin;

        /**
         * Constructor.
         *
         * @param   plugin  Plugin we work for.
         */
        PluginGuiPreferencesCreator(final PluginBo plugin) {
            this.plugin = plugin;
        }

        /**
         * Get plugin we work for.
         *
         * @return  Plugin.
         */
        public PluginBo getPlugin() {
            return plugin;
        }

        /**
         * Get plugin action name.
         *
         * @return  Plugin action name.
         */
        public String getName() {
            return plugin.getServiceAction();
        }

        /**
         * Get default plugin values.
         *
         * @return  Default values.
         */
        private Parameters getDefaultPluginValues() {
            final Parameters parameters = new Parameters();
            plugin.setDefaultValuesForEmptyPluginParameters(parameters);
            return parameters;
        }

        JComponent createDefault() {
            return create(getDefaultPluginValues());
        }

        abstract JComponent create(Parameters parameters);

    }

}