package org.jabref.gui.preftabs; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import org.jabref.Globals; import org.jabref.gui.JabRefFrame; import org.jabref.gui.externalfiletype.ExternalFileTypeEditor; import org.jabref.gui.push.PushToApplication; import org.jabref.gui.push.PushToApplicationButton; import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.OS; import org.jabref.preferences.JabRefPreferences; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; class ExternalTab extends JPanel implements PrefsTab { private final JabRefPreferences prefs; private final JabRefFrame frame; private final JTextField emailSubject; private final JTextField citeCommand; private final JCheckBox openFoldersOfAttachedFiles; private final JRadioButton defaultConsole; private final JRadioButton executeConsole; private final JTextField consoleCommand; private final JButton browseButton; private final JRadioButton adobeAcrobatReader; private final JRadioButton sumatraReader; private final JTextField adobeAcrobatReaderPath; private final JTextField sumatraReaderPath; private final JButton browseAdobeAcrobatReader; private final JButton browseSumatraReader; public ExternalTab(JabRefFrame frame, PreferencesDialog prefsDiag, JabRefPreferences prefs) { this.prefs = prefs; this.frame = frame; setLayout(new BorderLayout()); JButton editFileTypes = new JButton(Localization.lang("Manage external file types")); citeCommand = new JTextField(25); editFileTypes.addActionListener(ExternalFileTypeEditor.getAction(prefsDiag)); defaultConsole = new JRadioButton(Localization.lang("Use default terminal emulator")); executeConsole = new JRadioButton(Localization.lang("Execute command") + ":"); consoleCommand = new JTextField(); browseButton = new JButton(Localization.lang("Browse")); adobeAcrobatReader = new JRadioButton(Localization.lang("Adobe Acrobat Reader")); adobeAcrobatReaderPath = new JTextField(); browseAdobeAcrobatReader = new JButton(Localization.lang("Browse")); sumatraReader = new JRadioButton(Localization.lang("Sumatra Reader")); sumatraReaderPath = new JTextField(); browseSumatraReader = new JButton(Localization.lang("Browse")); JLabel commandDescription = new JLabel(Localization.lang( "Note: Use the placeholder %0 for the location of the opened library file.", "%DIR")); ButtonGroup consoleOptions = new ButtonGroup(); consoleOptions.add(defaultConsole); consoleOptions.add(executeConsole); ButtonGroup readerOptions = new ButtonGroup(); readerOptions.add(adobeAcrobatReader); JPanel pdfOptionPanel = new JPanel(new GridBagLayout()); GridBagConstraints pdfLayoutConstrains = new GridBagConstraints(); JPanel consoleOptionPanel = new JPanel(new GridBagLayout()); GridBagConstraints layoutConstraints = new GridBagConstraints(); defaultConsole.addActionListener(e -> updateExecuteConsoleButtonAndFieldEnabledState()); executeConsole.addActionListener(e -> updateExecuteConsoleButtonAndFieldEnabledState()); browseButton.addActionListener(e -> showConsoleChooser()); browseAdobeAcrobatReader.addActionListener(e -> showAdobeChooser()); layoutConstraints.fill = GridBagConstraints.HORIZONTAL; pdfLayoutConstrains.fill = GridBagConstraints.HORIZONTAL; layoutConstraints.gridx = 0; layoutConstraints.gridy = 0; layoutConstraints.insets = new Insets(0, 0, 6, 0); consoleOptionPanel.add(defaultConsole, layoutConstraints); layoutConstraints.gridy = 1; consoleOptionPanel.add(executeConsole, layoutConstraints); layoutConstraints.gridx = 1; consoleOptionPanel.add(consoleCommand, layoutConstraints); layoutConstraints.gridx = 2; layoutConstraints.insets = new Insets(0, 4, 6, 0); consoleOptionPanel.add(browseButton, layoutConstraints); layoutConstraints.gridx = 1; layoutConstraints.gridy = 2; consoleOptionPanel.add(commandDescription, layoutConstraints); pdfLayoutConstrains.gridx = 0; pdfLayoutConstrains.gridy = 0; pdfLayoutConstrains.insets = new Insets(0, 0, 6, 0); pdfOptionPanel.add(adobeAcrobatReader, pdfLayoutConstrains); pdfLayoutConstrains.gridx = 1; pdfOptionPanel.add(adobeAcrobatReaderPath,pdfLayoutConstrains); pdfLayoutConstrains.gridx = 2; pdfOptionPanel.add(browseAdobeAcrobatReader, pdfLayoutConstrains); if (OS.WINDOWS) { readerOptions.add(sumatraReader); browseSumatraReader.addActionListener(e -> showSumatraChooser()); pdfLayoutConstrains.gridy = 1; pdfLayoutConstrains.gridx = 0; pdfOptionPanel.add(sumatraReader,pdfLayoutConstrains); pdfLayoutConstrains.gridx = 1; pdfOptionPanel.add(sumatraReaderPath, pdfLayoutConstrains); pdfLayoutConstrains.gridx = 2; pdfOptionPanel.add(browseSumatraReader, pdfLayoutConstrains); } FormLayout layout = new FormLayout( "1dlu, 8dlu, left:pref, 4dlu, fill:150dlu, 4dlu, fill:pref", ""); DefaultFormBuilder builder = new DefaultFormBuilder(layout); builder.appendSeparator(Localization.lang("Sending of emails")); builder.append(new JPanel()); JLabel lab = new JLabel(Localization.lang("Subject for sending an email with references").concat(":")); builder.append(lab); emailSubject = new JTextField(25); builder.append(emailSubject); builder.nextLine(); builder.append(new JPanel()); openFoldersOfAttachedFiles = new JCheckBox(Localization.lang("Automatically open folders of attached files")); builder.append(openFoldersOfAttachedFiles); builder.nextLine(); builder.appendSeparator(Localization.lang("External programs")); builder.nextLine(); JPanel butpan = new JPanel(); butpan.setLayout(new GridLayout(3, 3)); for (PushToApplication pushToApplication : frame.getPushApplications().getApplications()) { addSettingsButton(pushToApplication, butpan); } builder.append(new JPanel()); builder.append(butpan, 3); builder.nextLine(); lab = new JLabel(Localization.lang("Cite command") + ':'); JPanel pan = new JPanel(); builder.append(pan); builder.append(lab); builder.append(citeCommand); builder.nextLine(); builder.append(pan); builder.append(editFileTypes); builder.nextLine(); builder.appendSeparator(Localization.lang("Open console")); builder.nextLine(); builder.append(new JPanel()); builder.append(consoleOptionPanel); builder.nextLine(); builder.appendSeparator(Localization.lang("Open PDF")); builder.nextLine(); builder.append(new JPanel()); builder.append(pdfOptionPanel); pan = builder.getPanel(); pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); add(pan, BorderLayout.CENTER); } private void addSettingsButton(final PushToApplication pt, JPanel p) { JButton button = new JButton(Localization.lang("Settings for %0", pt.getApplicationName()), pt.getIcon()); button.addActionListener(e -> PushToApplicationButton.showSettingsDialog(frame, pt, pt.getSettingsPanel())); p.add(button); } @Override public void setValues() { emailSubject.setText(prefs.get(JabRefPreferences.EMAIL_SUBJECT)); openFoldersOfAttachedFiles.setSelected(prefs.getBoolean(JabRefPreferences.OPEN_FOLDERS_OF_ATTACHED_FILES)); citeCommand.setText(prefs.get(JabRefPreferences.CITE_COMMAND)); defaultConsole.setSelected(Globals.prefs.getBoolean(JabRefPreferences.USE_DEFAULT_CONSOLE_APPLICATION)); executeConsole.setSelected(!Globals.prefs.getBoolean(JabRefPreferences.USE_DEFAULT_CONSOLE_APPLICATION)); consoleCommand.setText(Globals.prefs.get(JabRefPreferences.CONSOLE_COMMAND)); adobeAcrobatReaderPath.setText(Globals.prefs.get(JabRefPreferences.ADOBE_ACROBAT_COMMAND)); if (OS.WINDOWS) { sumatraReaderPath.setText(Globals.prefs.get(JabRefPreferences.SUMATRA_PDF_COMMAND)); if (Globals.prefs.get(JabRefPreferences.USE_PDF_READER).equals(adobeAcrobatReaderPath.getText())) { adobeAcrobatReader.setSelected(true); } else if (Globals.prefs.get(JabRefPreferences.USE_PDF_READER).equals(sumatraReaderPath.getText())) { sumatraReader.setSelected(true); } } updateExecuteConsoleButtonAndFieldEnabledState(); } @Override public void storeSettings() { prefs.put(JabRefPreferences.EMAIL_SUBJECT, emailSubject.getText()); prefs.putBoolean(JabRefPreferences.OPEN_FOLDERS_OF_ATTACHED_FILES, openFoldersOfAttachedFiles.isSelected()); prefs.put(JabRefPreferences.CITE_COMMAND, citeCommand.getText()); prefs.putBoolean(JabRefPreferences.USE_DEFAULT_CONSOLE_APPLICATION, defaultConsole.isSelected()); prefs.put(JabRefPreferences.CONSOLE_COMMAND, consoleCommand.getText()); prefs.put(JabRefPreferences.ADOBE_ACROBAT_COMMAND, adobeAcrobatReaderPath.getText()); if (OS.WINDOWS) { prefs.put(JabRefPreferences.SUMATRA_PDF_COMMAND, sumatraReaderPath.getText()); } readerSelected(); } @Override public boolean validateSettings() { return true; } @Override public String getTabName() { return Localization.lang("External programs"); } private void updateExecuteConsoleButtonAndFieldEnabledState() { browseButton.setEnabled(executeConsole.isSelected()); consoleCommand.setEnabled(executeConsole.isSelected()); } private void showConsoleChooser() { JFileChooser consoleChooser = new JFileChooser(); int answer = consoleChooser.showOpenDialog(ExternalTab.this); if (answer == JFileChooser.APPROVE_OPTION) { consoleCommand.setText(consoleChooser.getSelectedFile().getAbsolutePath()); } } private void showAdobeChooser() { JFileChooser adobeChooser = new JFileChooser(); int answer = adobeChooser.showOpenDialog(ExternalTab.this); if (answer == JFileChooser.APPROVE_OPTION) { adobeAcrobatReaderPath.setText(adobeChooser.getSelectedFile().getAbsolutePath()); } } private void showSumatraChooser() { JFileChooser adobeChooser = new JFileChooser(); int answer = adobeChooser.showOpenDialog(ExternalTab.this); if (answer == JFileChooser.APPROVE_OPTION) { sumatraReaderPath.setText(adobeChooser.getSelectedFile().getAbsolutePath()); } } private void readerSelected() { if (adobeAcrobatReader.isSelected()) { prefs.put(JabRefPreferences.USE_PDF_READER, adobeAcrobatReaderPath.getText()); } else if (sumatraReader.isSelected()) { prefs.put(JabRefPreferences.USE_PDF_READER, sumatraReaderPath.getText()); } } }