/* Copyright (C) 2003-2011 JabRef contributors.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package net.sf.jabref.imports;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import javax.swing.*;
import net.sf.jabref.BibtexFields;
import net.sf.jabref.FocusRequester;
import net.sf.jabref.GUIGlobals;
import net.sf.jabref.Globals;
import net.sf.jabref.JabRefFrame;
import net.sf.jabref.SidePaneComponent;
import net.sf.jabref.SidePaneManager;
import net.sf.jabref.Util;
import net.sf.jabref.gui.FetcherPreviewDialog;
import net.sf.jabref.gui.ImportInspectionDialog;
import net.sf.jabref.help.HelpAction;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class GeneralFetcher extends SidePaneComponent implements ActionListener {
JTextField tf = new JTextField();
JPanel pan = new JPanel();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints con = new GridBagConstraints();
JButton go = new JButton(Globals.lang("Fetch")), helpBut = new JButton(
GUIGlobals.getImage("helpSmall")), reset = new JButton(Globals
.lang("Reset"));
JComboBox fetcherChoice;
CardLayout optionsCards = new CardLayout();
JPanel optionsPanel = new JPanel(optionsCards);
JPanel optPanel = new JPanel(new BorderLayout());
HelpAction help;
SidePaneManager sidePaneManager;
Action action;
JabRefFrame frame;
EntryFetcher activeFetcher;
EntryFetcher[] fetcherArray;
public GeneralFetcher(SidePaneManager p0, JabRefFrame frame, final List<EntryFetcher> fetchers) {
super(p0, GUIGlobals.getIconUrl("www"), Globals.lang("Web search"));
this.sidePaneManager = p0;
this.frame = frame;
fetcherArray = fetchers.toArray(new EntryFetcher[fetchers.size()]);
Arrays.sort(fetcherArray, new EntryFetcherComparator());
//JLabel[] choices = new JLabel[fetchers.size()];
String[] choices = new String[fetcherArray.length];
for (int i=0; i<fetcherArray.length; i++) {
choices[i] = fetcherArray[i].getTitle();
//choices[i] = new JLabel(fetchers.get(i).getTitle(), new ImageIcon(fetchers.get(i).getIcon()),
// JLabel.HORIZONTAL);
/*if (fetchers.get(i).getOptionsPanel() != null)
optionsPanel.add(fetchers.get(i).getOptionsPanel(), String.valueOf(i));
else
optionsPanel.add(new JPanel(), String.valueOf(i));*/
}
fetcherChoice = new JComboBox(choices);
int defaultFetcher = Globals.prefs.getInt("selectedFetcherIndex");
if (defaultFetcher >= fetcherArray.length)
defaultFetcher = 0;
this.activeFetcher = fetcherArray[defaultFetcher];
fetcherChoice.setSelectedIndex(defaultFetcher);
if (this.activeFetcher.getOptionsPanel() != null)
optPanel.add(this.activeFetcher.getOptionsPanel(), BorderLayout.CENTER);
helpBut.setEnabled(activeFetcher.getHelpPage() != null);
//optionsCards.show(optionsPanel, String.valueOf(defaultFetcher));
/*fetcherChoice.setRenderer(new ListCellRenderer() {
JLabel label = new JLabel();
public Component getListCellRendererComponent(JList jList, Object o, int i, boolean isSelected,
boolean cellHasFocus) {
JLabel theLab = (JLabel)o;
label.setIcon(theLab.getIcon());
label.setText(theLab.getText());
if (cellHasFocus) {
label.setBackground(UIManager.getDefaults().getColor("ComboBox.selectionBackground").darker());
label.setForeground(UIManager.getDefaults().getColor("ComboBox.foreground"));
} else {
label.setBackground(UIManager.getDefaults().getColor("ComboBox.background"));
label.setForeground(UIManager.getDefaults().getColor("ComboBox.foreground"));
}
return label;
}
});*/
fetcherChoice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
activeFetcher = fetcherArray[fetcherChoice.getSelectedIndex()];
Globals.prefs.putInt("selectedFetcherIndex", fetcherChoice.getSelectedIndex());
if (activeFetcher.getHelpPage() != null) {
help.setHelpFile(activeFetcher.getHelpPage());
helpBut.setEnabled(true);
} else {
helpBut.setEnabled(false);
}
optionsCards.show(optionsPanel, String.valueOf(fetcherChoice.getSelectedIndex()));
optPanel.removeAll();
if (activeFetcher.getOptionsPanel() != null)
optPanel.add(activeFetcher.getOptionsPanel(), BorderLayout.CENTER);
revalidate();
}
});
action = new FetcherAction();
help = new HelpAction(Globals.helpDiag, activeFetcher.getHelpPage(), "Help");
helpBut.addActionListener(help);
helpBut.setMargin(new Insets(0, 0, 0, 0));
tf.setPreferredSize(new Dimension(1,tf.getPreferredSize().height));
tf.setName("tf");
// add action to reset-button. resets tf and requests focus
reset.addActionListener(new AbstractAction() {
public void actionPerformed(ActionEvent event) {
tf.setText("");
new FocusRequester(tf);
}
});
JPanel main = new JPanel();
main.setLayout(gbl);
con.fill = GridBagConstraints.BOTH;
con.insets = new Insets(0, 0, 2, 0);
con.gridwidth = GridBagConstraints.REMAINDER;
con.weightx = 1;
con.weighty = 0;
con.weighty = 1;
con.insets = new Insets(1, 0, 1, 0);
con.fill = GridBagConstraints.BOTH;
gbl.setConstraints(fetcherChoice, con);
main.add(fetcherChoice);
con.insets = new Insets(0, 0, 0, 0);
gbl.setConstraints(tf, con);
main.add(tf);
// Go Button
con.weighty = 0;
con.gridwidth = 1;
gbl.setConstraints(go, con);
main.add(go);
// Reset Button
reset.setName("reset");
gbl.setConstraints(reset, con);
main.add(reset);
// Help Button
con.gridwidth = GridBagConstraints.REMAINDER;
gbl.setConstraints(helpBut, con);
main.add(helpBut);
if (pan != null) {
gbl.setConstraints(optPanel, con);
main.add(optPanel);
}
main.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
add(main, BorderLayout.CENTER);
go.addActionListener(this);
tf.addActionListener(this);
}
public void setHelpResourceOwner(Class c) {
help.setResourceOwner(c);
}
public JTextField getTextField() {
return tf;
}
public Action getAction() {
return action;
}
public void actionPerformed(ActionEvent e) {
if (tf.getText().trim().length() == 0) {
frame.output(Globals.lang("Please enter a search string"));
return;
}
if(frame.basePanel() == null) {
frame.output(Globals.lang("Please open or start a new database before searching"));
return;
}
// We have two categories of fetchers. One category can show previews first and ask the
// user which ones to download:
if (activeFetcher instanceof PreviewEntryFetcher) {
frame.output(Globals.lang("Searching..."));
frame.setProgressBarIndeterminate(true);
frame.setProgressBarVisible(true);
final PreviewEntryFetcher pFetcher = (PreviewEntryFetcher)activeFetcher;
final FetcherPreviewDialog dialog = new FetcherPreviewDialog(frame,
pFetcher.getWarningLimit(), pFetcher.getPreferredPreviewHeight());
new Thread(new Runnable(){
public void run(){
final boolean result = pFetcher.processQueryGetPreview(tf.getText().trim(), dialog, dialog);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.setProgressBarVisible(false);
frame.output("");
if (!result)
return;
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
if (dialog.isOkPressed()) {
final ImportInspectionDialog d2 = new ImportInspectionDialog(frame, frame.basePanel(),
BibtexFields.DEFAULT_INSPECTION_FIELDS, activeFetcher.getTitle(), false);
d2.addCallBack(activeFetcher);
Util.placeDialog(d2, frame);
d2.setVisible(true);
new Thread(new Runnable() {
public void run() {
pFetcher.getEntries(dialog.getSelection(), d2);
d2.entryListComplete();
}
}).start();
}
}
});
}
}).start();
}
// The other category downloads the entries first, then asks the user which ones to keep:
else {
final ImportInspectionDialog dialog = new ImportInspectionDialog(frame, frame.basePanel(),
BibtexFields.DEFAULT_INSPECTION_FIELDS, activeFetcher.getTitle(), false);
dialog.addCallBack(activeFetcher);
Util.placeDialog(dialog, frame);
dialog.setVisible(true);
new Thread(new Runnable(){
public void run(){
if (activeFetcher.processQuery(tf.getText().trim(), dialog, dialog)){
dialog.entryListComplete();
} else {
dialog.dispose();
}
}
}).start();
}
}
class FetcherAction extends AbstractAction {
public FetcherAction() {
super(Globals.lang("Web search"), GUIGlobals.getImage("www"));
//if ((activeFetcher.getKeyName() != null) && (activeFetcher.getKeyName().length() > 0))
putValue(ACCELERATOR_KEY, Globals.prefs.getKey("Fetch Medline"));
}
public void actionPerformed(ActionEvent e) {
if (!sidePaneManager.hasComponent(GeneralFetcher.this.getTitle())){
sidePaneManager.register(GeneralFetcher.this.getTitle(), GeneralFetcher.this);
}
if (frame.getTabbedPane().getTabCount() > 0) {
sidePaneManager.toggle(GeneralFetcher.this.getTitle());
if (sidePaneManager.isComponentVisible(GeneralFetcher.this.getTitle())) {
new FocusRequester(getTextField());
}
}
}
}
@Override
public void componentClosing() {
super.componentClosing();
Globals.prefs.putBoolean("webSearchVisible", Boolean.FALSE);
}
@Override
public void componentOpening() {
super.componentOpening();
Globals.prefs.putBoolean("webSearchVisible", Boolean.TRUE);
}
class EntryFetcherComparator implements Comparator<EntryFetcher> {
public int compare(EntryFetcher entryFetcher, EntryFetcher entryFetcher1) {
return entryFetcher.getTitle().compareTo(entryFetcher1.getTitle());
}
}
}