package org.jabref.gui.bibtexkeypattern; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JScrollPane; import org.jabref.Globals; import org.jabref.gui.BasePanel; import org.jabref.gui.PreviewPanel; import org.jabref.gui.keyboard.KeyBinding; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.FormBuilder; import com.jgoodies.forms.layout.FormLayout; /** * Dialog box for resolving duplicate bibte keys */ class ResolveDuplicateLabelDialog { private final JDialog diag; private final List<JCheckBox> cbs = new ArrayList<>(); private boolean okPressed; private boolean cancelPressed; public ResolveDuplicateLabelDialog(BasePanel panel, String key, List<BibEntry> entries) { diag = new JDialog(panel.frame(), Localization.lang("Duplicate BibTeX key"), true); FormBuilder b = FormBuilder.create().layout(new FormLayout( "left:pref, 4dlu, fill:pref", "p")); b.add(new JLabel(Localization.lang("Duplicate BibTeX key") + ": " + key)).xyw(1, 1, 3); b.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); boolean first = true; int row = 3; for (BibEntry entry : entries) { JCheckBox cb = new JCheckBox(Localization.lang("Generate BibTeX key"), !first); b.appendRows("1dlu, p"); b.add(cb).xy(1, row); PreviewPanel pp = new PreviewPanel(null, entry, null); pp.setPreferredSize(new Dimension(800, 90)); b.add(new JScrollPane(pp)).xy(3, row); row += 2; cbs.add(cb); first = false; } ButtonBarBuilder bb = new ButtonBarBuilder(); bb.addGlue(); JButton ok = new JButton(Localization.lang("OK")); bb.addButton(ok); JButton ignore = new JButton(Localization.lang("Ignore")); bb.addButton(ignore); JButton cancel = new JButton(Localization.lang("Cancel")); bb.addButton(cancel); bb.addGlue(); bb.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); diag.getContentPane().add(b.getPanel(), BorderLayout.CENTER); diag.getContentPane().add(bb.getPanel(), BorderLayout.SOUTH); diag.pack(); ok.addActionListener(e -> { okPressed = true; diag.dispose(); }); ignore.addActionListener(e -> diag.dispose()); AbstractAction closeAction = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { cancelPressed = true; diag.dispose(); } }; cancel.addActionListener(closeAction); ActionMap am = b.getPanel().getActionMap(); InputMap im = b.getPanel().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); im.put(Globals.getKeyPrefs().getKey(KeyBinding.CLOSE_DIALOG), "close"); am.put("close", closeAction); } /** * After the dialog has been closed, this query answers whether the dialog was okPressed * (by cancel button or by closing the dialog directly). * @return true if it was okPressed, false if Ok was pressed. */ public boolean isOkPressed() { return okPressed; } /** * Get the list of checkboxes where the user has selected which entries to generate * new keys for. * @return the list of checkboxes */ public List<JCheckBox> getCheckBoxes() { return cbs; } public void show() { okPressed = false; diag.setLocationRelativeTo(diag.getParent()); diag.setVisible(true); } public boolean isCancelPressed() { return cancelPressed; } }