package org.jabref.gui.preftabs; import java.awt.BorderLayout; import java.util.Optional; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import org.jabref.Globals; import org.jabref.gui.help.HelpAction; import org.jabref.gui.remote.JabRefMessageHandler; import org.jabref.logic.help.HelpFile; import org.jabref.logic.journals.JournalAbbreviationPreferences; import org.jabref.logic.l10n.Localization; import org.jabref.logic.remote.RemotePreferences; import org.jabref.logic.remote.RemoteUtil; import org.jabref.preferences.JabRefPreferences; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; class AdvancedTab extends JPanel implements PrefsTab { private final JabRefPreferences preferences; private final JCheckBox useRemoteServer; private final JCheckBox useIEEEAbrv; private final JTextField remoteServerPort; private final JCheckBox useCaseKeeperOnSearch; private final JCheckBox useUnitFormatterOnSearch; private final RemotePreferences remotePreferences; public AdvancedTab(JabRefPreferences prefs) { preferences = prefs; remotePreferences = prefs.getRemotePreferences(); useRemoteServer = new JCheckBox(Localization.lang("Listen for remote operation on port") + ':'); useIEEEAbrv = new JCheckBox(Localization.lang("Use IEEE LaTeX abbreviations")); remoteServerPort = new JTextField(); useCaseKeeperOnSearch = new JCheckBox(Localization.lang("Add {} to specified title words on search to keep the correct case")); useUnitFormatterOnSearch = new JCheckBox(Localization.lang("Format units by adding non-breaking separators and keeping the correct case on search")); FormLayout layout = new FormLayout ("1dlu, 8dlu, left:pref, 4dlu, fill:3dlu",//, 4dlu, fill:pref",// 4dlu, left:pref, 4dlu", ""); DefaultFormBuilder builder = new DefaultFormBuilder(layout); JPanel pan = new JPanel(); builder.appendSeparator(Localization.lang("Remote operation")); builder.nextLine(); builder.append(new JPanel()); builder.append(new JLabel("<html>" + Localization.lang("This feature lets new files be opened or imported into an " + "already running instance of JabRef<BR>instead of opening a new instance. For instance, this " + "is useful when you open a file in JabRef<br>from your web browser." + "<BR>Note that this will prevent you from running more than one instance of JabRef at a time.") + "</html>")); builder.nextLine(); builder.append(new JPanel()); JPanel p = new JPanel(); p.add(useRemoteServer); p.add(remoteServerPort); p.add(new HelpAction(HelpFile.REMOTE).getHelpButton()); builder.append(p); // IEEE builder.nextLine(); builder.appendSeparator(Localization.lang("Search %0", "IEEEXplore")); builder.nextLine(); builder.append(new JPanel()); builder.append(useIEEEAbrv); builder.nextLine(); builder.appendSeparator(Localization.lang("Import conversions")); builder.nextLine(); builder.append(pan); builder.append(useCaseKeeperOnSearch); builder.nextLine(); builder.append(pan); builder.append(useUnitFormatterOnSearch); pan = builder.getPanel(); pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); setLayout(new BorderLayout()); add(pan, BorderLayout.CENTER); } @Override public void setValues() { useRemoteServer.setSelected(remotePreferences.useRemoteServer()); remoteServerPort.setText(String.valueOf(remotePreferences.getPort())); useIEEEAbrv.setSelected(Globals.prefs.getJournalAbbreviationPreferences().useIEEEAbbreviations()); useCaseKeeperOnSearch.setSelected(Globals.prefs.getBoolean(JabRefPreferences.USE_CASE_KEEPER_ON_SEARCH)); useUnitFormatterOnSearch.setSelected(Globals.prefs.getBoolean(JabRefPreferences.USE_UNIT_FORMATTER_ON_SEARCH)); } @Override public void storeSettings() { JournalAbbreviationPreferences journalAbbreviationPreferences = Globals.prefs.getJournalAbbreviationPreferences(); if (journalAbbreviationPreferences.useIEEEAbbreviations() != useIEEEAbrv.isSelected()) { journalAbbreviationPreferences.setUseIEEEAbbreviations(useIEEEAbrv.isSelected()); Globals.prefs.storeJournalAbbreviationPreferences(journalAbbreviationPreferences); Globals.journalAbbreviationLoader.update(journalAbbreviationPreferences); } storeRemoteSettings(); preferences.putBoolean(JabRefPreferences.USE_CASE_KEEPER_ON_SEARCH, useCaseKeeperOnSearch.isSelected()); preferences.putBoolean(JabRefPreferences.USE_UNIT_FORMATTER_ON_SEARCH, useUnitFormatterOnSearch.isSelected()); } private void storeRemoteSettings() { getPortAsInt().ifPresent(newPort -> { if (remotePreferences.isDifferentPort(newPort)) { remotePreferences.setPort(newPort); if (remotePreferences.useRemoteServer()) { JOptionPane.showMessageDialog(null, Localization.lang("Remote server port").concat(" ") .concat(Localization.lang("You must restart JabRef for this to come into effect.")), Localization.lang("Remote server port"), JOptionPane.WARNING_MESSAGE); } } }); remotePreferences.setUseRemoteServer(useRemoteServer.isSelected()); if (remotePreferences.useRemoteServer()) { Globals.REMOTE_LISTENER.openAndStart(new JabRefMessageHandler(), remotePreferences.getPort()); } else { Globals.REMOTE_LISTENER.stop(); } preferences.setRemotePreferences(remotePreferences); } private Optional<Integer> getPortAsInt() { try { return Optional.of(Integer.parseInt(remoteServerPort.getText())); } catch (NumberFormatException ex) { return Optional.empty(); } } @Override public boolean validateSettings() { try { int portNumber = Integer.parseInt(remoteServerPort.getText()); if (RemoteUtil.isUserPort(portNumber)) { return true; } else { throw new NumberFormatException(); } } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, Localization.lang("You must enter an integer value in the interval 1025-65535 in the text field for") + " '" + Localization.lang("Remote server port") + '\'', Localization.lang("Remote server port"), JOptionPane.ERROR_MESSAGE); return false; } } @Override public String getTabName() { return Localization.lang("Advanced"); } }