[svn-inject] Installing original source of jabref
[debian/jabref.git] / src / java / net / sf / jabref / gui / MainTableSelectionListener.
1 package net.sf.jabref.gui;
2
3 import ca.odell.glazedlists.event.ListEventListener;
4 import ca.odell.glazedlists.event.ListEvent;
5 import ca.odell.glazedlists.EventList;
6 import net.sf.jabref.*;
7
8 import javax.swing.*;
9 import java.awt.event.MouseListener;
10 import java.awt.event.MouseEvent;
11 import java.io.IOException;
12
13 /**
14  * Created by IntelliJ IDEA.
15  * User: alver
16  * Date: Oct 15, 2005
17  * Time: 3:02:52 AM
18  * To change this template use File | Settings | File Templates.
19  */
20 public class MainTableSelectionListener implements ListEventListener, MouseListener {
21
22     PreviewPanel[] previewPanel = null;
23     int activePreview = 1;
24     PreviewPanel preview;
25     MainTable table;
26     BasePanel panel;
27     EventList tableRows;
28     private boolean previewActive = Globals.prefs.getBoolean("previewEnabled");
29     private boolean workingOnPreview = false;
30
31     public MainTableSelectionListener(BasePanel panel, MainTable table) {
32         this.table = table;
33         this.panel = panel;
34         this.tableRows = table.getTableRows();
35         instantiatePreviews();
36         this.preview = previewPanel[activePreview];
37     }
38
39     private void instantiatePreviews() {
40         previewPanel = new PreviewPanel[]
41                 {new PreviewPanel(panel.database(), Globals.prefs.get("preview0")),
42                         new PreviewPanel(panel.database(), Globals.prefs.get("preview1"))};
43         BibtexEntry testEntry = PreviewPrefsTab.getTestEntry();
44         previewPanel[0].setEntry(testEntry);
45         previewPanel[1].setEntry(testEntry);
46     }
47
48     public void updatePreviews() {
49         try {
50             previewPanel[0].readLayout(Globals.prefs.get("preview0"));
51             previewPanel[1].readLayout(Globals.prefs.get("preview1"));
52         } catch (Exception e) {
53             e.printStackTrace();
54         }
55     }
56
57     public void listChanged(ListEvent e) {
58         //System.out.println(e);
59         EventList selected = e.getSourceList();
60         Object newSelected = null;
61         while (e.next()) {
62             if (e.getType() == ListEvent.INSERT) {
63                 if (newSelected != null)
64                     return; // More than one new selected. Do nothing.
65                 else {
66                     if (e.getIndex() < selected.size())
67                         newSelected = selected.get(e.getIndex());
68                 }
69
70             }
71         }
72
73
74         if (newSelected != null) {
75
76             // Ok, we have a single new entry that has been selected. Now decide what to do with it:
77             final BibtexEntry toShow = (BibtexEntry) newSelected;
78             final int mode = panel.getMode(); // What is the panel already showing?
79             if ((mode == BasePanel.WILL_SHOW_EDITOR) || (mode == BasePanel.SHOWING_EDITOR)) {
80                 // An entry is currently being edited.
81                 EntryEditor oldEditor = panel.getCurrentEditor();
82                 // Get an old or new editor for the entry to edit:
83                 EntryEditor newEditor = panel.getEntryEditor(toShow);
84                 // Show the new editor unless it was already visible:
85                 if ((newEditor != oldEditor) || (mode != BasePanel.SHOWING_EDITOR)) {
86                     panel.showEntryEditor(newEditor);
87                 }
88             } else {
89                 // Either nothing or a preview was shown. Update the preview.
90                 if (previewActive) {
91                     updatePreview(toShow, false);
92                 }
93
94             }
95         }
96
97     }
98
99     private void updatePreview(final BibtexEntry toShow, final boolean changedPreview) {
100         if (workingOnPreview)
101             return;
102         final int mode = panel.getMode();
103         workingOnPreview = true;
104         final Runnable update = new Runnable() {
105             public void run() {
106                 // If nothing was already shown, set the preview and move the separator:
107                 if (changedPreview || (mode == BasePanel.SHOWING_NOTHING)) {
108                     panel.showPreview(preview);
109                     panel.adjustSplitter();
110                 }
111                 workingOnPreview = false;
112             }
113         };
114         final Runnable worker = new Runnable() {
115             public void run() {
116                 preview.setEntry(toShow);
117                 SwingUtilities.invokeLater(update);
118             }
119         };
120         (new Thread(worker)).start();
121     }
122
123     public void editSignalled() {
124         if (table.getSelected().size() == 1) {
125             editSignalled((BibtexEntry) table.getSelected().get(0));
126         }
127     }
128
129     public void editSignalled(BibtexEntry entry) {
130         final int mode = panel.getMode();
131         EntryEditor editor = panel.getEntryEditor(entry);
132         if (mode != BasePanel.SHOWING_EDITOR) {
133             panel.showEntryEditor(editor);
134             panel.adjustSplitter();
135         }
136         new FocusRequester(editor);
137     }
138
139     public void mouseReleased(MouseEvent e) {
140         // First find the column on which the user has clicked.
141         final int col = table.columnAtPoint(e.getPoint()),
142                 row = table.rowAtPoint(e.getPoint());
143         // Check if the user has right-clicked. If so, open the right-click menu.
144         if (e.isPopupTrigger()) {
145             processPopupTrigger(e, row, col);
146             return;
147         }
148     }
149
150     protected void processPopupTrigger(MouseEvent e, int row, int col) {
151         int selRow = table.getSelectedRow();
152         if (selRow == -1 ||// (getSelectedRowCount() == 0))
153                 !table.isRowSelected(table.rowAtPoint(e.getPoint()))) {
154             table.setRowSelectionInterval(row, row);
155             //panel.updateViewToSelected();
156         }
157         RightClickMenu rightClickMenu = new RightClickMenu(panel, panel.metaData());
158         rightClickMenu.show(table, e.getX(), e.getY());
159     }
160
161     public void mousePressed(MouseEvent e) {
162
163         // First find the column on which the user has clicked.
164         final int col = table.columnAtPoint(e.getPoint()),
165                 row = table.rowAtPoint(e.getPoint());
166
167         // A double click on an entry should open the entry's editor.
168         if (e.getClickCount() == 2) {
169
170             BibtexEntry toShow = (BibtexEntry) tableRows.get(row);
171             editSignalled(toShow);
172         }
173
174         // Check if the user has right-clicked. If so, open the right-click menu.
175         if (e.isPopupTrigger()) {
176             processPopupTrigger(e, row, col);
177             return;
178         }
179
180         // Check if the user has clicked on an icon cell to open url or pdf.
181         final String[] iconType = table.getIconTypeForColumn(col);
182         if (iconType != null) {
183
184             Object value = table.getValueAt(row, col);
185             if (value == null) return; // No icon here, so we do nothing.
186
187             final BibtexEntry entry = (BibtexEntry) tableRows.get(row);
188
189             // Get the icon type. Corresponds to the field name.
190             int hasField = -1;
191             for (int i = iconType.length - 1; i >= 0; i--)
192                 if (entry.getField(iconType[i]) != null)
193                     hasField = i;
194             if (hasField == -1)
195                 return;
196             final String fieldName = iconType[hasField];
197
198             // Open it now. We do this in a thread, so the program won't freeze during the wait.
199             (new Thread() {
200                 public void run() {
201                     panel.output(Globals.lang("External viewer called") + ".");
202
203                     Object link = entry.getField(fieldName);
204                     if (iconType == null) {
205                         Globals.logger("Error: no link to " + fieldName + ".");
206                         return; // There is an icon, but the field is not set.
207                     }
208
209                     try {
210                         Util.openExternalViewer((String) link, fieldName, Globals.prefs);
211                     }
212                     catch (IOException ex) {
213                         panel.output(Globals.lang("Error") + ": " + ex.getMessage());
214                     }
215                 }
216
217             }).start();
218         }
219     }
220
221     public void entryEditorClosing(EntryEditor editor) {
222         preview.setEntry(editor.getEntry());
223         if (previewActive)
224             panel.showPreview(preview);
225         else
226             panel.hideBottomComponent();
227         panel.adjustSplitter();
228         new FocusRequester(table);
229     }
230
231
232     public void mouseClicked(MouseEvent e) {
233
234     }
235
236     public void mouseEntered(MouseEvent e) {
237
238     }
239
240     public void mouseExited(MouseEvent e) {
241
242     }
243
244     public void setPreviewActive(boolean enabled) {
245         previewActive = enabled;
246         if (!previewActive) {
247             panel.hideBottomComponent();
248         } else {
249             if (table.getSelected().size() > 0 ) {
250                 updatePreview((BibtexEntry) table.getSelected().get(0), false);
251             }
252         }
253     }
254
255     public void switchPreview() {
256         if (activePreview < previewPanel.length - 1)
257             activePreview++;
258         else
259             activePreview = 0;
260         if (previewActive) {
261             this.preview = previewPanel[activePreview];
262
263             if (table.getSelected().size() > 0) {
264                 updatePreview((BibtexEntry) table.getSelected().get(0), true);
265             }
266         }
267     }
268 }