package org.jabref.gui.shared;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.EmptyBorder;
import org.jabref.gui.JabRefFrame;
import org.jabref.gui.mergeentries.MergeEntries;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.database.BibDatabaseMode;
import org.jabref.model.entry.BibEntry;
import org.jabref.shared.DBMSSynchronizer;
public class MergeSharedEntryDialog {
private final JabRefFrame jabRefFrame;
private final DBMSSynchronizer dbmsSynchronizer;
private final BibEntry localBibEntry;
private final BibEntry sharedBibEntry;
private final JDialog mergeDialog;
private final MergeEntries mergeEntries;
public MergeSharedEntryDialog(JabRefFrame jabRefFrame, DBMSSynchronizer dbmsSynchronizer, BibEntry localBibEntry,
BibEntry sharedBibEntry, BibDatabaseMode bibDatabaseMode) {
this.jabRefFrame = jabRefFrame;
this.dbmsSynchronizer = dbmsSynchronizer;
this.localBibEntry = localBibEntry;
this.sharedBibEntry = sharedBibEntry;
this.mergeDialog = new JDialog(jabRefFrame, Localization.lang("Update refused"), true);
this.mergeEntries = new MergeEntries(sharedBibEntry, localBibEntry, Localization.lang("Shared entry"),
Localization.lang("Local entry"), bibDatabaseMode);
}
public void showMergeDialog() {
mergeDialog.setMinimumSize(new Dimension(600, 600));
StringBuilder message = new StringBuilder();
message.append("<html>");
message.append("<b>");
message.append(Localization.lang("Update could not be performed due to existing change conflicts."));
message.append("</b>");
message.append("<br/><br/>");
message.append(Localization.lang("You are not working on the newest version of BibEntry."));
message.append("<br/><br/>");
message.append(Localization.lang("Shared version: %0", String.valueOf(sharedBibEntry.getSharedBibEntryData().getVersion())));
message.append("<br/>");
message.append(Localization.lang("Local version: %0", String.valueOf(localBibEntry.getSharedBibEntryData().getVersion())));
message.append("<br/><br/>");
message.append(Localization.lang("Please merge the shared entry with yours and press \"Merge entries\" to resolve this problem."));
message.append("<br/>");
JLabel mergeInnformation = new JLabel(message.toString());
mergeInnformation.setBorder(new EmptyBorder(9, 9, 9, 9));
mergeDialog.add(mergeInnformation, BorderLayout.NORTH);
mergeDialog.add(mergeEntries.getMergeEntryPanel(), BorderLayout.CENTER);
JButton mergeButton = new JButton(Localization.lang("Merge entries"));
mergeButton.addActionListener(e -> mergeEntries());
JButton cancelButton = new JButton(Localization.lang("Cancel"));
cancelButton.addActionListener(e -> showConfirmationDialog());
JPanel buttonPanel = new JPanel();
buttonPanel.add(mergeButton, BorderLayout.WEST);
buttonPanel.add(cancelButton, BorderLayout.EAST);
mergeDialog.add(buttonPanel, BorderLayout.SOUTH);
mergeDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
mergeDialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
showConfirmationDialog();
}
});
mergeDialog.setLocationRelativeTo(jabRefFrame);
mergeDialog.pack();
mergeDialog.setVisible(true);
}
private void showConfirmationDialog() {
int answer = JOptionPane.showConfirmDialog(mergeDialog,
Localization.lang("Canceling this operation will leave your changes unsynchronized. Cancel anyway?"),
Localization.lang("Warning"), JOptionPane.YES_NO_OPTION);
if (answer == 0) {
mergeDialog.dispose();
}
}
private void mergeEntries() {
BibEntry mergedBibEntry = mergeEntries.getMergeEntry();
mergedBibEntry.getSharedBibEntryData().setSharedID(sharedBibEntry.getSharedBibEntryData().getSharedID());
mergedBibEntry.getSharedBibEntryData().setVersion(sharedBibEntry.getSharedBibEntryData().getVersion());
mergeDialog.dispose(); // dispose before synchronizing to avoid multiple merge windows in case of new conflict.
dbmsSynchronizer.synchronizeSharedEntry(mergedBibEntry);
dbmsSynchronizer.synchronizeLocalDatabase();
}
}