package org.jabref.gui.preftabs; import java.awt.GridBagConstraints; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import org.jabref.Globals; import org.jabref.gui.BasePanel; import org.jabref.gui.bibtexkeypattern.BibtexKeyPatternPanel; import org.jabref.logic.l10n.Localization; import org.jabref.model.bibtexkeypattern.GlobalBibtexKeyPattern; import org.jabref.preferences.JabRefPreferences; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; /** * The Preferences panel for key generation. */ class BibtexKeyPatternPrefTab extends BibtexKeyPatternPanel implements PrefsTab { private final JabRefPreferences prefs; private final JCheckBox dontOverwrite = new JCheckBox(Localization.lang("Do not overwrite existing keys")); private final JCheckBox warnBeforeOverwriting = new JCheckBox(Localization.lang("Warn before overwriting existing keys")); private final JCheckBox generateOnSave = new JCheckBox(Localization.lang("Generate keys before saving (for entries without a key)")); private final JCheckBox autoGenerateOnImport = new JCheckBox(Localization.lang("Generate keys for imported entries")); private final JRadioButton letterStartA = new JRadioButton(Localization.lang("Ensure unique keys using letters (a, b, ...)")); private final JRadioButton letterStartB = new JRadioButton(Localization.lang("Ensure unique keys using letters (b, c, ...)")); private final JRadioButton alwaysAddLetter = new JRadioButton(Localization.lang("Always add letter (a, b, ...) to generated keys")); private final JTextField keyPatternRegex = new JTextField(20); private final JTextField keyPatternReplacement = new JTextField(20); public BibtexKeyPatternPrefTab(JabRefPreferences prefs, BasePanel panel) { super(panel); this.prefs = prefs; appendKeyGeneratorSettings(); } /** * Store changes to table preferences. This method is called when the user clicks Ok. * */ @Override public void storeSettings() { // Set the default value: Globals.prefs.put(JabRefPreferences.DEFAULT_BIBTEX_KEY_PATTERN, defaultPat.getText()); Globals.prefs.putBoolean(JabRefPreferences.WARN_BEFORE_OVERWRITING_KEY, warnBeforeOverwriting.isSelected()); Globals.prefs.putBoolean(JabRefPreferences.AVOID_OVERWRITING_KEY, dontOverwrite.isSelected()); Globals.prefs.put(JabRefPreferences.KEY_PATTERN_REGEX, keyPatternRegex.getText()); Globals.prefs.put(JabRefPreferences.KEY_PATTERN_REPLACEMENT, keyPatternReplacement.getText()); Globals.prefs.putBoolean(JabRefPreferences.GENERATE_KEYS_AFTER_INSPECTION, autoGenerateOnImport.isSelected()); Globals.prefs.putBoolean(JabRefPreferences.GENERATE_KEYS_BEFORE_SAVING, generateOnSave.isSelected()); if (alwaysAddLetter.isSelected()) { Globals.prefs.putBoolean(JabRefPreferences.KEY_GEN_ALWAYS_ADD_LETTER, true); } else if (letterStartA.isSelected()) { Globals.prefs.putBoolean(JabRefPreferences.KEY_GEN_FIRST_LETTER_A, true); Globals.prefs.putBoolean(JabRefPreferences.KEY_GEN_ALWAYS_ADD_LETTER, false); } else { Globals.prefs.putBoolean(JabRefPreferences.KEY_GEN_FIRST_LETTER_A, false); Globals.prefs.putBoolean(JabRefPreferences.KEY_GEN_ALWAYS_ADD_LETTER, false); } // fetch entries from GUI GlobalBibtexKeyPattern keypatterns = getKeyPatternAsGlobalBibtexKeyPattern(); // store new patterns globally prefs.putKeyPattern(keypatterns); } private void appendKeyGeneratorSettings() { ButtonGroup bg = new ButtonGroup(); bg.add(letterStartA); bg.add(letterStartB); bg.add(alwaysAddLetter); // Build a panel for checkbox settings: FormLayout layout = new FormLayout ("1dlu, 8dlu, left:pref, 8dlu, left:pref", ""); JPanel pan = new JPanel(); DefaultFormBuilder builder = new DefaultFormBuilder(layout); builder.appendSeparator(Localization.lang("Key generator settings")); builder.nextLine(); builder.append(pan); builder.append(autoGenerateOnImport); builder.append(letterStartA); builder.nextLine(); builder.append(pan); builder.append(warnBeforeOverwriting); builder.append(letterStartB); builder.nextLine(); builder.append(pan); builder.append(dontOverwrite); builder.append(alwaysAddLetter); builder.nextLine(); builder.append(pan); builder.append(generateOnSave); builder.nextLine(); builder.append(pan); builder.append(Localization.lang("Replace (regular expression)") + ':'); builder.append(Localization.lang("by") + ':'); builder.nextLine(); builder.append(pan); builder.append(keyPatternRegex); builder.append(keyPatternReplacement); builder.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); con.gridx = 1; con.gridy = 3; con.gridwidth = GridBagConstraints.REMAINDER; con.weightx = 1; con.fill = GridBagConstraints.BOTH; gbl.setConstraints(builder.getPanel(), con); add(builder.getPanel()); dontOverwrite.addChangeListener(e -> // Warning before overwriting is only relevant if overwriting can happen: warnBeforeOverwriting.setEnabled(!dontOverwrite.isSelected())); } @Override public boolean validateSettings() { return true; } @Override public void setValues() { super.setValues(Globals.prefs.getKeyPattern()); defaultPat.setText(Globals.prefs.get(JabRefPreferences.DEFAULT_BIBTEX_KEY_PATTERN)); dontOverwrite.setSelected(Globals.prefs.getBoolean(JabRefPreferences.AVOID_OVERWRITING_KEY)); generateOnSave.setSelected(Globals.prefs.getBoolean(JabRefPreferences.GENERATE_KEYS_BEFORE_SAVING)); autoGenerateOnImport.setSelected(Globals.prefs.getBoolean(JabRefPreferences.GENERATE_KEYS_AFTER_INSPECTION)); warnBeforeOverwriting.setSelected(Globals.prefs.getBoolean(JabRefPreferences.WARN_BEFORE_OVERWRITING_KEY)); boolean prefAlwaysAddLetter = Globals.prefs.getBoolean(JabRefPreferences.KEY_GEN_ALWAYS_ADD_LETTER); boolean firstLetterA = Globals.prefs.getBoolean(JabRefPreferences.KEY_GEN_FIRST_LETTER_A); if (prefAlwaysAddLetter) { this.alwaysAddLetter.setSelected(true); } else if (firstLetterA) { this.letterStartA.setSelected(true); } else { this.letterStartB.setSelected(true); } // Warning before overwriting is only relevant if overwriting can happen: warnBeforeOverwriting.setEnabled(!dontOverwrite.isSelected()); keyPatternRegex.setText(Globals.prefs.get(JabRefPreferences.KEY_PATTERN_REGEX)); keyPatternReplacement.setText(Globals.prefs.get(JabRefPreferences.KEY_PATTERN_REPLACEMENT)); } @Override public String getTabName() { return Localization.lang("BibTeX key generator"); } }