6f0f55f7364d9cd4a6ac5fa5dd7b9b48a4cbfee1
[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         DUPLICATE_SEARCH = 1,
31         IMPORT_CHECK = 2,
32     INSPECTION = 3;
33
34     final Dimension DIM = new Dimension(650, 600);
35
36     PreviewPanel p1, p2;
37     JTextArea ta1, ta2;
38     JTabbedPane tabbed = new JTabbedPane();
39     GridBagLayout gbl = new GridBagLayout();
40     GridBagConstraints con = new GridBagConstraints();
41     JButton first, second, both,
42         cancel = new JButton(Globals.lang("Cancel"));
43     JPanel options = new JPanel(),
44         main = new JPanel(),
45         source = new JPanel();
46     int status = NOT_CHOSEN;
47     boolean block = true;
48     TitleLabel lab;
49
50   public DuplicateResolverDialog(JabRefFrame frame, BibtexEntry one, BibtexEntry two, int type) {
51     super(frame, Globals.lang("Possible duplicate entries"), true);
52
53       switch (type) {
54           case DUPLICATE_SEARCH:
55               first = new JButton(Globals.lang("Keep upper"));
56               second = new JButton(Globals.lang("Keep lower"));
57               both = new JButton(Globals.lang("Keep both"));
58               break;
59           case INSPECTION:
60               first = new JButton(Globals.lang("Remove old entry"));
61               second = new JButton(Globals.lang("Remove entry from import"));
62               both = new JButton(Globals.lang("Keep both"));
63               break;
64           default:
65               first = new JButton(Globals.lang("Import and remove old entry"));
66                   second = new JButton(Globals.lang("Do not import entry"));
67                   both = new JButton(Globals.lang("Import and keep old entry"));
68       }
69
70     String layout = Globals.prefs.get("preview0");
71     p1 = new PreviewPanel(one, new MetaData(), layout);
72     p2 = new PreviewPanel(two, new MetaData(), layout);
73     ta1 = new JTextArea();
74     ta2 = new JTextArea();
75     ta1.setEditable(false);
76     ta2.setEditable(false);
77
78     //ta1.setPreferredSize(dim);
79     //ta2.setPreferredSize(dim);
80
81     setSourceView(one, two);
82
83     //getContentPane().setLayout();
84     main.setLayout(gbl);
85     source.setLayout(gbl);
86     con.insets = new Insets(10,10,0,10);
87     con.fill = GridBagConstraints.BOTH;
88     con.gridwidth = GridBagConstraints.REMAINDER;
89     con.weightx = 1;
90     con.weighty = 0;
91     lab = new TitleLabel(Globals.lang((type==DUPLICATE_SEARCH)?"":
92                                   "Entry in current database"));
93     gbl.setConstraints(lab, con);
94     main.add(lab);
95     con.weighty = 1;
96     con.insets = new Insets(5,10,10,10);
97     JScrollPane sp = new JScrollPane(p1);
98     gbl.setConstraints(sp, con);
99     main.add(sp);
100     con.weighty = 0;
101     con.insets = new Insets(10,10,0,10);
102     lab = new TitleLabel(Globals.lang((type==DUPLICATE_SEARCH)?"":
103                                   "Entry in import"));
104     gbl.setConstraints(lab, con);
105     main.add(lab);
106     con.weighty = 1;
107     con.insets = new Insets(5,10,10,10);
108     sp = new JScrollPane(ta1);
109     gbl.setConstraints(sp, con);
110     source.add(sp);
111     sp = new JScrollPane(p2);
112     gbl.setConstraints(sp, con);
113     main.add(sp);
114     sp = new JScrollPane(ta2);
115     gbl.setConstraints(sp, con);
116     source.add(sp);
117     tabbed.add(Globals.lang("Short form"), main);
118     tabbed.add(Globals.lang("Complete record"), source);
119     options.add(first);
120     options.add(second);
121     options.add(both);
122     if (type != IMPORT_CHECK) {
123         options.add(Box.createHorizontalStrut(5));
124         options.add(cancel);
125     }
126
127     first.addActionListener(new ActionListener() {
128       public void actionPerformed(ActionEvent e) {
129         status = KEEP_UPPER;
130         block = false;
131         dispose();
132       }
133     });
134
135     second.addActionListener(new ActionListener() {
136       public void actionPerformed(ActionEvent e) {
137         status = KEEP_LOWER;
138         block = false;
139         dispose();
140       }
141     });
142
143     both.addActionListener(new ActionListener() {
144       public void actionPerformed(ActionEvent e) {
145         status = KEEP_BOTH;
146         block = false;
147         dispose();
148       }
149     });
150
151     cancel.addActionListener(new ActionListener() {
152       public void actionPerformed(ActionEvent e) {
153         status = BREAK;
154         block = false;
155         dispose();
156       }
157     });
158
159     getContentPane().add(tabbed, BorderLayout.CENTER);
160     getContentPane().add(options, BorderLayout.SOUTH);
161     pack();
162
163
164     if (getHeight() > DIM.height) {
165         setSize(new Dimension(getWidth(), DIM.height));
166     }
167     if (getWidth() > DIM.width) {
168         setSize(new Dimension(DIM.width, getHeight()));
169     }
170
171
172     both.requestFocus();
173     Util.placeDialog(this, frame);
174   }
175
176   private void setSourceView(BibtexEntry one, BibtexEntry two) {
177     try {
178       StringWriter sw = new StringWriter();
179       one.write(sw, new LatexFieldFormatter(), false);
180       ta1.setText(sw.getBuffer().toString());
181       sw = new StringWriter();
182       two.write(sw, new LatexFieldFormatter(), false);
183       ta2.setText(sw.getBuffer().toString());
184     }
185     catch (IOException ex) {
186     }
187   }
188
189
190
191   public void setEntries(BibtexEntry newOne, BibtexEntry newTwo) {
192     setSourceView(newOne, newTwo);
193     p1.setEntry(newOne);
194     p2.setEntry(newTwo);
195     status = NOT_CHOSEN;
196     p1.revalidate();
197     p1.repaint();
198     block = true;
199   }
200
201 public boolean isBlocking() {
202   return block;
203 }
204
205   public int getSelected() {
206     return status;
207   }
208
209   public static int resolveDuplicate(JabRefFrame frame, BibtexEntry one, BibtexEntry two) {
210     DuplicateResolverDialog drd = new DuplicateResolverDialog(frame, one, two,
211                                                               DUPLICATE_SEARCH);
212     drd.setVisible(true); // drd.show(); -> deprecated since 1.5
213     return drd.getSelected();
214   }
215
216 }