eba19618fe840ebc2ad2ba281481ec662fbf9ec1
[debian/jabref.git] / src / java / net / sf / jabref / DuplicateResolverDialog.java
1 package net.sf.jabref;
2
3 import javax.swing.JDialog;
4 import java.awt.HeadlessException;
5 import java.awt.GridBagLayout;
6 import java.awt.GridBagConstraints;
7 import javax.swing.*;
8 import java.awt.Insets;
9 import java.awt.BorderLayout;
10 import java.awt.event.ActionListener;
11 import java.awt.event.ActionEvent;
12 import java.io.*;
13 import net.sf.jabref.export.*;
14 import java.awt.*;
15
16
17 // created by : ?
18 //
19 // modified : r.nagel 2.09.2004
20 //            - insert close button
21
22 public class DuplicateResolverDialog extends JDialog {
23
24     public static final int
25         NOT_CHOSEN = -1,
26         KEEP_BOTH = 0,
27         KEEP_UPPER = 1,
28         KEEP_LOWER = 2,
29         BREAK      = 5,  // close
30         IMPORT_AND_DELETE_OLD = 1,
31         IMPORT_AND_KEEP_OLD = 0,
32         DO_NOT_IMPORT = 2,
33         DUPLICATE_SEARCH = 1,
34         IMPORT_CHECK = 2,
35     INSPECTION = 3;
36
37     final Dimension DIM = new Dimension(650, 600);
38
39     PreviewPanel p1, p2;
40     JTextArea ta1, ta2;
41     JTabbedPane tabbed = new JTabbedPane();
42     GridBagLayout gbl = new GridBagLayout();
43     GridBagConstraints con = new GridBagConstraints();
44     JButton first, second, both,
45         cancel = new JButton(Globals.lang("Cancel"));
46     JPanel options = new JPanel(),
47         main = new JPanel(),
48         source = new JPanel();
49     int status = NOT_CHOSEN;
50     boolean block = true;
51     TitleLabel lab;
52
53   public DuplicateResolverDialog(JFrame frame, BibtexEntry one, BibtexEntry two, int type) {
54       super(frame, Globals.lang("Possible duplicate entries"), true);
55       init(one, two, type);
56       Util.placeDialog(this, frame);
57   }
58
59     public DuplicateResolverDialog(JDialog frame, BibtexEntry one, BibtexEntry two, int type) {
60         super(frame, Globals.lang("Possible duplicate entries"), true);
61         init(one, two, type);
62         Util.placeDialog(this, frame);
63     }
64
65     private void init(BibtexEntry one, BibtexEntry two, int type) {
66       switch (type) {
67           case DUPLICATE_SEARCH:
68               first = new JButton(Globals.lang("Keep upper"));
69               second = new JButton(Globals.lang("Keep lower"));
70               both = new JButton(Globals.lang("Keep both"));
71               break;
72           case INSPECTION:
73               first = new JButton(Globals.lang("Remove old entry"));
74               second = new JButton(Globals.lang("Remove entry from import"));
75               both = new JButton(Globals.lang("Keep both"));
76               break;
77           default:
78               first = new JButton(Globals.lang("Import and remove old entry"));
79                   second = new JButton(Globals.lang("Do not import entry"));
80                   both = new JButton(Globals.lang("Import and keep old entry"));
81       }
82
83     String layout = Globals.prefs.get("preview0");
84     p1 = new PreviewPanel(one, new MetaData(), layout);
85     p2 = new PreviewPanel(two, new MetaData(), layout);
86     ta1 = new JTextArea();
87     ta2 = new JTextArea();
88     ta1.setEditable(false);
89     ta2.setEditable(false);
90
91     //ta1.setPreferredSize(dim);
92     //ta2.setPreferredSize(dim);
93
94     setSourceView(one, two);
95
96     //getContentPane().setLayout();
97     main.setLayout(gbl);
98     source.setLayout(gbl);
99     con.insets = new Insets(10,10,0,10);
100     con.fill = GridBagConstraints.BOTH;
101     con.gridwidth = GridBagConstraints.REMAINDER;
102     con.weightx = 1;
103     con.weighty = 0;
104     lab = new TitleLabel((type==DUPLICATE_SEARCH) ? "" :
105                                   Globals.lang("Entry in current database"));
106     gbl.setConstraints(lab, con);
107     main.add(lab);
108     con.weighty = 1;
109     con.insets = new Insets(5,10,10,10);
110     JScrollPane sp = new JScrollPane(p1);
111     gbl.setConstraints(sp, con);
112     main.add(sp);
113     con.weighty = 0;
114     con.insets = new Insets(10,10,0,10);
115     lab = new TitleLabel((type==DUPLICATE_SEARCH) ? "" :
116                                   Globals.lang("Entry in import"));
117     gbl.setConstraints(lab, con);
118     main.add(lab);
119     con.weighty = 1;
120     con.insets = new Insets(5,10,10,10);
121     sp = new JScrollPane(ta1);
122     gbl.setConstraints(sp, con);
123     source.add(sp);
124     sp = new JScrollPane(p2);
125     gbl.setConstraints(sp, con);
126     main.add(sp);
127     sp = new JScrollPane(ta2);
128     gbl.setConstraints(sp, con);
129     source.add(sp);
130     tabbed.add(Globals.lang("Short form"), main);
131     tabbed.add(Globals.lang("Complete record"), source);
132     options.add(first);
133     options.add(second);
134     options.add(both);
135     if (type != IMPORT_CHECK) {
136         options.add(Box.createHorizontalStrut(5));
137         options.add(cancel);
138     }
139
140     first.addActionListener(new ActionListener() {
141       public void actionPerformed(ActionEvent e) {
142         status = KEEP_UPPER;
143         block = false;
144         dispose();
145       }
146     });
147
148     second.addActionListener(new ActionListener() {
149       public void actionPerformed(ActionEvent e) {
150         status = KEEP_LOWER;
151         block = false;
152         dispose();
153       }
154     });
155
156     both.addActionListener(new ActionListener() {
157       public void actionPerformed(ActionEvent e) {
158         status = KEEP_BOTH;
159         block = false;
160         dispose();
161       }
162     });
163
164     cancel.addActionListener(new ActionListener() {
165       public void actionPerformed(ActionEvent e) {
166         status = BREAK;
167         block = false;
168         dispose();
169       }
170     });
171
172     getContentPane().add(tabbed, BorderLayout.CENTER);
173     getContentPane().add(options, BorderLayout.SOUTH);
174     pack();
175
176
177     if (getHeight() > DIM.height) {
178         setSize(new Dimension(getWidth(), DIM.height));
179     }
180     if (getWidth() > DIM.width) {
181         setSize(new Dimension(DIM.width, getHeight()));
182     }
183
184
185     both.requestFocus();
186
187   }
188
189   private void setSourceView(BibtexEntry one, BibtexEntry two) {
190     try {
191       StringWriter sw = new StringWriter();
192       one.write(sw, new LatexFieldFormatter(), false);
193       ta1.setText(sw.getBuffer().toString());
194       sw = new StringWriter();
195       two.write(sw, new LatexFieldFormatter(), false);
196       ta2.setText(sw.getBuffer().toString());
197     }
198     catch (IOException ex) {
199     }
200   }
201
202
203
204   public void setEntries(BibtexEntry newOne, BibtexEntry newTwo) {
205     setSourceView(newOne, newTwo);
206     p1.setEntry(newOne);
207     p2.setEntry(newTwo);
208     status = NOT_CHOSEN;
209     p1.revalidate();
210     p1.repaint();
211     block = true;
212   }
213
214 public boolean isBlocking() {
215   return block;
216 }
217
218   public int getSelected() {
219     return status;
220   }
221
222   public static int resolveDuplicate(JFrame frame, BibtexEntry one, BibtexEntry two) {
223     DuplicateResolverDialog drd = new DuplicateResolverDialog(frame, one, two,
224                                                               DUPLICATE_SEARCH);
225     drd.setVisible(true); // drd.show(); -> deprecated since 1.5
226     return drd.getSelected();
227   }
228
229   public static int resolveDuplicate(JDialog frame, BibtexEntry one, BibtexEntry two) {
230     DuplicateResolverDialog drd = new DuplicateResolverDialog(frame, one, two,
231                                                               DUPLICATE_SEARCH);
232     drd.setVisible(true); // drd.show(); -> deprecated since 1.5
233     return drd.getSelected();
234   }
235
236   public static int resolveDuplicateInImport(JabRefFrame frame, BibtexEntry existing,
237                                            BibtexEntry imported) {
238     DuplicateResolverDialog drd = new DuplicateResolverDialog(frame, existing, imported,
239                                                               IMPORT_CHECK);
240     drd.setVisible(true); // drd.show(); -> deprecated since 1.5
241     return drd.getSelected();
242   }
243
244 }