package net.sf.jabref; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.StringWriter; import javax.swing.*; import net.sf.jabref.export.LatexFieldFormatter; // created by : ? // // modified : r.nagel 2.09.2004 // - insert close button public class DuplicateResolverDialog extends JDialog { public static final int NOT_CHOSEN = -1, KEEP_BOTH = 0, KEEP_UPPER = 1, KEEP_LOWER = 2, AUTOREMOVE_EXACT = 3, BREAK = 5, // close IMPORT_AND_DELETE_OLD = 1, IMPORT_AND_KEEP_OLD = 0, DO_NOT_IMPORT = 2, DUPLICATE_SEARCH = 1, IMPORT_CHECK = 2, INSPECTION = 3, DUPLICATE_SEARCH_WITH_EXACT = 4; final Dimension DIM = new Dimension(650, 600); PreviewPanel p1, p2; JTextArea ta1, ta2; JTabbedPane tabbed = new JTabbedPane(); GridBagLayout gbl = new GridBagLayout(); GridBagConstraints con = new GridBagConstraints(); JButton first, second, both, cancel = new JButton(Globals.lang("Cancel")), removeExact = null; JPanel options = new JPanel(), main = new JPanel(), source = new JPanel(); int status = NOT_CHOSEN; boolean block = true; TitleLabel lab; public DuplicateResolverDialog(JFrame frame, BibtexEntry one, BibtexEntry two, int type) { super(frame, Globals.lang("Possible duplicate entries"), true); init(one, two, type); Util.placeDialog(this, frame); } public DuplicateResolverDialog(JDialog frame, BibtexEntry one, BibtexEntry two, int type) { super(frame, Globals.lang("Possible duplicate entries"), true); init(one, two, type); Util.placeDialog(this, frame); } private void init(BibtexEntry one, BibtexEntry two, int type) { switch (type) { case DUPLICATE_SEARCH: first = new JButton(Globals.lang("Keep upper")); second = new JButton(Globals.lang("Keep lower")); both = new JButton(Globals.lang("Keep both")); break; case INSPECTION: first = new JButton(Globals.lang("Remove old entry")); second = new JButton(Globals.lang("Remove entry from import")); both = new JButton(Globals.lang("Keep both")); break; case DUPLICATE_SEARCH_WITH_EXACT: first = new JButton(Globals.lang("Keep upper")); second = new JButton(Globals.lang("Keep lower")); both = new JButton(Globals.lang("Keep both")); removeExact = new JButton(Globals.lang("Automatically remove exact duplicates")); break; default: first = new JButton(Globals.lang("Import and remove old entry")); second = new JButton(Globals.lang("Do not import entry")); both = new JButton(Globals.lang("Import and keep old entry")); } String layout = Globals.prefs.get("preview0"); p1 = new PreviewPanel(null, one, null, new MetaData(), layout); p2 = new PreviewPanel(null, two, null, new MetaData(), layout); ta1 = new JTextArea(); ta2 = new JTextArea(); ta1.setEditable(false); ta2.setEditable(false); //ta1.setPreferredSize(dim); //ta2.setPreferredSize(dim); setSourceView(one, two); //getContentPane().setLayout(); main.setLayout(gbl); source.setLayout(gbl); con.insets = new Insets(10,10,0,10); con.fill = GridBagConstraints.BOTH; con.gridwidth = GridBagConstraints.REMAINDER; con.weightx = 1; con.weighty = 0; lab = new TitleLabel((type==DUPLICATE_SEARCH) ? "" : Globals.lang("Entry in current database")); gbl.setConstraints(lab, con); main.add(lab); con.weighty = 1; con.insets = new Insets(5,10,10,10); JScrollPane sp = new JScrollPane(p1); gbl.setConstraints(sp, con); main.add(sp); con.weighty = 0; con.insets = new Insets(10,10,0,10); lab = new TitleLabel((type==DUPLICATE_SEARCH) ? "" : Globals.lang("Entry in import")); gbl.setConstraints(lab, con); main.add(lab); con.weighty = 1; con.insets = new Insets(5,10,10,10); sp = new JScrollPane(ta1); gbl.setConstraints(sp, con); source.add(sp); sp = new JScrollPane(p2); gbl.setConstraints(sp, con); main.add(sp); sp = new JScrollPane(ta2); gbl.setConstraints(sp, con); source.add(sp); tabbed.add(Globals.lang("Short form"), main); tabbed.add(Globals.lang("Complete record"), source); if (removeExact != null) options.add(removeExact); options.add(first); options.add(second); options.add(both); if (type != IMPORT_CHECK) { options.add(Box.createHorizontalStrut(5)); options.add(cancel); } first.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { status = KEEP_UPPER; block = false; dispose(); } }); second.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { status = KEEP_LOWER; block = false; dispose(); } }); both.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { status = KEEP_BOTH; block = false; dispose(); } }); if (removeExact != null) removeExact.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { status = AUTOREMOVE_EXACT; block = false; dispose(); } }); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { status = BREAK; block = false; dispose(); } }); getContentPane().add(tabbed, BorderLayout.CENTER); getContentPane().add(options, BorderLayout.SOUTH); pack(); if (getHeight() > DIM.height) { setSize(new Dimension(getWidth(), DIM.height)); } if (getWidth() > DIM.width) { setSize(new Dimension(DIM.width, getHeight())); } both.requestFocus(); } private void setSourceView(BibtexEntry one, BibtexEntry two) { try { StringWriter sw = new StringWriter(); one.write(sw, new LatexFieldFormatter(), false); ta1.setText(sw.getBuffer().toString()); sw = new StringWriter(); two.write(sw, new LatexFieldFormatter(), false); ta2.setText(sw.getBuffer().toString()); } catch (IOException ex) { } } public void setEntries(BibtexEntry newOne, BibtexEntry newTwo) { setSourceView(newOne, newTwo); p1.setEntry(newOne); p2.setEntry(newTwo); status = NOT_CHOSEN; p1.revalidate(); p1.repaint(); block = true; } public boolean isBlocking() { return block; } public int getSelected() { return status; } public static int resolveDuplicate(JFrame frame, BibtexEntry one, BibtexEntry two) { DuplicateResolverDialog drd = new DuplicateResolverDialog(frame, one, two, DUPLICATE_SEARCH); drd.setVisible(true); // drd.show(); -> deprecated since 1.5 return drd.getSelected(); } public static int resolveDuplicate(JDialog frame, BibtexEntry one, BibtexEntry two) { DuplicateResolverDialog drd = new DuplicateResolverDialog(frame, one, two, DUPLICATE_SEARCH); drd.setVisible(true); // drd.show(); -> deprecated since 1.5 return drd.getSelected(); } public static int resolveDuplicateInImport(JabRefFrame frame, BibtexEntry existing, BibtexEntry imported) { DuplicateResolverDialog drd = new DuplicateResolverDialog(frame.getFrame(), existing, imported, IMPORT_CHECK); drd.setVisible(true); // drd.show(); -> deprecated since 1.5 return drd.getSelected(); } }