ca8217860bc1e5c8cd91911e27d4a31a8acfc9ae
[debian/jabref.git] / src / java / net / sf / jabref / external / ExternalFileTypeEditor.java
1 package net.sf.jabref.external;
2
3 import net.sf.jabref.JabRefFrame;
4 import net.sf.jabref.Globals;
5 import net.sf.jabref.GUIGlobals;
6 import net.sf.jabref.MnemonicAwareAction;
7
8 import javax.swing.*;
9 import javax.swing.table.AbstractTableModel;
10 import javax.swing.table.TableCellRenderer;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.awt.*;
14 import java.awt.event.ActionListener;
15 import java.awt.event.ActionEvent;
16 import java.awt.event.MouseAdapter;
17 import java.awt.event.MouseEvent;
18
19 import com.jgoodies.forms.builder.ButtonBarBuilder;
20 import com.jgoodies.forms.builder.ButtonStackBuilder;
21
22 /**
23  * Editor for external file types.
24  */
25 public class ExternalFileTypeEditor extends JDialog {
26
27     private JFrame frame = null;
28     private JDialog dialog = null;
29     private ArrayList<ExternalFileType> fileTypes;
30     private JTable table;
31     private ExternalFileTypeEntryEditor entryEditor = null;
32     private FileTypeTableModel tableModel;
33     private JButton ok = new JButton(Globals.lang("Ok")),
34         cancel = new JButton(Globals.lang("Cancel"));
35     private JButton add = new JButton(GUIGlobals.getImage("add")),
36         remove = new JButton(GUIGlobals.getImage("remove")),
37         edit = new JButton(GUIGlobals.getImage("edit")),
38         toDefaults = new JButton(Globals.lang("Default"));
39     private EditListener editListener = new EditListener();
40
41     public ExternalFileTypeEditor(JFrame frame) {
42         super(frame, Globals.lang("Manage external file types"), true);
43         this.frame = frame;
44         init();
45     }
46
47     public ExternalFileTypeEditor(JDialog dialog) {
48         super(dialog, Globals.lang("Manage external file types"), true);
49         this.dialog = dialog;
50         init();
51     }
52
53     /**
54      * Update the editor to show the current settings in Preferences.
55      */
56     public void setValues() {
57         fileTypes.clear();
58         ExternalFileType[] types = Globals.prefs.getExternalFileTypeSelection();
59         for (int i = 0; i < types.length; i++) {
60
61             fileTypes.add(types[i].copy());
62         }
63         Collections.sort(fileTypes);
64     }
65
66     /**
67      * Store the list of external entry types to Preferences.
68      */
69     public void storeSettings() {
70         Globals.prefs.setExternalFileTypes(fileTypes);
71     }
72
73     private void init() {
74
75         ok.addActionListener(new ActionListener() {
76             public void actionPerformed(ActionEvent e) {
77                 storeSettings();
78                 dispose();
79             }
80         });
81         cancel.addActionListener(new ActionListener() {
82             public void actionPerformed(ActionEvent e) {
83                 dispose();
84             }
85         });
86         // The toDefaults resets the entire list to its default values.
87         toDefaults.addActionListener(new ActionListener() {
88             public void actionPerformed(ActionEvent e) {
89                 /*int reply = JOptionPane.showConfirmDialog(ExternalFileTypeEditor.this,
90                         Globals.lang("All custom file types will be lost. Proceed?"),
91                         Globals.lang("Reset file type definitons"), JOptionPane.YES_NO_OPTION,
92                         JOptionPane.QUESTION_MESSAGE);*/
93                 //if (reply == JOptionPane.YES_OPTION) {
94                     java.util.List<ExternalFileType> list = Globals.prefs.getDefaultExternalFileTypes();
95                     fileTypes.clear();
96                     fileTypes.addAll(list);
97                     Collections.sort(fileTypes);
98                     //Globals.prefs.resetExternalFileTypesToDefault();
99                     //setValues();
100                     tableModel.fireTableDataChanged();
101                 //}
102             }
103         });
104
105         add.addActionListener(new AddListener());
106         remove.addActionListener(new RemoveListener());
107         edit.addActionListener(editListener);
108         fileTypes = new ArrayList<ExternalFileType>();
109         setValues();
110         
111
112         tableModel = new FileTypeTableModel();
113         table = new JTable(tableModel);
114         table.setDefaultRenderer(ImageIcon.class, new IconRenderer());
115         table.addMouseListener(new TableClickListener());
116
117         table.getColumnModel().getColumn(0).setMaxWidth(24);
118         table.getColumnModel().getColumn(0).setMinWidth(24);
119         table.getColumnModel().getColumn(1).setMinWidth(170);
120         table.getColumnModel().getColumn(2).setMinWidth(60);
121         table.getColumnModel().getColumn(3).setMinWidth(100);
122         table.getColumnModel().getColumn(0).setResizable(false);
123         
124         JScrollPane sp = new JScrollPane(table);
125
126         JPanel upper = new JPanel();
127         upper.setLayout(new BorderLayout());
128         upper.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
129         upper.add(sp, BorderLayout.CENTER);
130         getContentPane().add(upper, BorderLayout.CENTER);
131
132         ButtonStackBuilder bs = new ButtonStackBuilder();
133         bs.addGridded(add);
134         bs.addGridded(remove);
135         bs.addGridded(edit);
136         bs.addRelatedGap();
137         bs.addGridded(toDefaults);
138         upper.add(bs.getPanel(), BorderLayout.EAST);
139
140         ButtonBarBuilder bb = new ButtonBarBuilder();
141         bb.addGlue();
142         bb.addGridded(ok);
143         bb.addGridded(cancel);
144         bb.addGlue();
145         bb.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
146         getContentPane().add(bb.getPanel(), BorderLayout.SOUTH);
147         pack();
148
149         if (frame != null)
150             setLocationRelativeTo(frame);
151         else
152             setLocationRelativeTo(dialog);
153     }
154
155     private ExternalFileTypeEntryEditor getEditor(ExternalFileType type) {
156         if (entryEditor == null)
157             entryEditor = new ExternalFileTypeEntryEditor(ExternalFileTypeEditor.this,  type);
158         else
159             entryEditor.setEntry(type);
160         return entryEditor;
161     }
162
163     /**
164      * Get an AbstractAction for opening the external file types editor.
165      * @param frame The JFrame used as parent window for the dialog.
166      * @return An Action for opening the editor.
167      */
168     public static AbstractAction getAction(JabRefFrame frame) {
169         return new EditExternalFileTypesAction(frame);
170     }
171
172     /**
173      * Get an AbstractAction for opening the external file types editor.
174      * @param dialog The JDialog used as parent window for the dialog.
175      * @return An Action for opening the editor.
176      */
177     public static AbstractAction getAction(JDialog dialog) {
178         return new EditExternalFileTypesAction(dialog);
179     }
180
181     class AddListener implements ActionListener {
182         public void actionPerformed(ActionEvent e) {
183             // Generate a new file type:
184             ExternalFileType type = new ExternalFileType("", "", "", "new");
185             // Show the file type editor:
186             getEditor(type).setVisible(true);
187             if (entryEditor.okPressed()) {
188                 // Ok was pressed. Add the new file type and update the table:
189                 fileTypes.add(type);
190                 tableModel.fireTableDataChanged();
191             }
192         }
193     }
194
195     class RemoveListener implements ActionListener {
196
197         public void actionPerformed(ActionEvent e) {
198             int[] rows = table.getSelectedRows();
199             if (rows.length == 0)
200                 return;
201             for (int i=rows.length-1; i>=0; i--) {
202                 fileTypes.remove(rows[i]);
203             }
204             tableModel.fireTableDataChanged();
205             if (fileTypes.size() > 0) {
206                 int row = Math.min(rows[0], fileTypes.size()-1);
207                 table.setRowSelectionInterval(row, row);
208             }
209         }
210     }
211
212     class EditListener implements ActionListener {
213
214         public void actionPerformed(ActionEvent e) {
215             int[] rows = table.getSelectedRows();
216             if (rows.length != 1)
217                 return;
218             getEditor(fileTypes.get(rows[0])).setVisible(true);
219             if (entryEditor.okPressed())
220                 tableModel.fireTableDataChanged();
221         }
222     }
223
224     class IconRenderer implements TableCellRenderer {
225         JLabel lab = new JLabel();
226
227         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
228             lab.setText(null);
229             lab.setIcon((ImageIcon)value);
230             return lab;
231         }
232     }
233
234     class FileTypeTableModel extends AbstractTableModel {
235
236         public int getColumnCount() {
237             return 4;
238         }
239
240         public int getRowCount() {
241             return fileTypes.size();
242         }
243
244         public String getColumnName(int column) {
245             switch (column) {
246                 case 0:
247                     return " ";
248                 case 1:
249                     return Globals.lang("Name");
250                 case 2:
251                     return Globals.lang("Extension");
252                 case 3:
253                     return Globals.lang("Application");
254                 default:
255                     return null;
256             }
257         }
258
259         public Class<?> getColumnClass(int columnIndex) {
260             if (columnIndex == 0)
261                 return ImageIcon.class;
262             else return String.class;
263         }
264
265         public Object getValueAt(int rowIndex, int columnIndex) {
266             ExternalFileType type = fileTypes.get(rowIndex);
267             switch (columnIndex) {
268                 case 0:
269                     return type.getIcon();
270                 case 1:
271                     return type.getName();
272                 case 2:
273                     return type.getExtension();
274                 case 3:
275                     return type.getOpenWith();
276                 default:
277                     return null;
278             }
279         }
280     }
281
282     class TableClickListener extends MouseAdapter {
283
284         private void handleClick(MouseEvent e) {
285             if (e.getClickCount() == 2) {
286                 editListener.actionPerformed(null);
287             }
288         }
289
290         public void mouseClicked(MouseEvent e) {
291             handleClick(e);
292         }
293
294         public void mousePressed(MouseEvent e) {
295             handleClick(e);
296         }
297
298         public void mouseReleased(MouseEvent e) {
299             handleClick(e);
300         }
301     }
302
303     public static class EditExternalFileTypesAction extends MnemonicAwareAction {
304         private JFrame frame = null;
305         private JDialog dialog = null;
306         ExternalFileTypeEditor editor = null;
307
308         public EditExternalFileTypesAction(JFrame frame) {
309             super();
310             putValue(NAME, "Manage external file types");
311             this.frame = frame;
312         }
313
314         public EditExternalFileTypesAction(JDialog dialog) {
315             super();
316             putValue(NAME, "Manage external file types");
317             this.dialog = dialog;
318         }
319
320         public void actionPerformed(ActionEvent e) {
321             if (editor == null) {
322                 if (frame != null)
323                     editor = new ExternalFileTypeEditor(frame);
324                 else
325                     editor = new ExternalFileTypeEditor(dialog);
326             }
327             editor.setValues();
328             editor.setVisible(true);
329         }
330     }
331
332 }