From 6d60cd6fd8906be1da64be05b11453ea576d925c Mon Sep 17 00:00:00 2001 From: Christian Bartsch Date: Wed, 28 Sep 2016 13:47:03 +0200 Subject: [PATCH] enhance toggle behaviour --- .../net/sf/jabref/collab/FileUpdatePanel.java | 5 ++ .../java/net/sf/jabref/gui/BasePanel.java | 16 ++--- .../java/net/sf/jabref/gui/JabRefFrame.java | 51 +++++--------- .../net/sf/jabref/gui/SidePaneComponent.java | 51 +++++++++++++- .../net/sf/jabref/gui/SidePaneManager.java | 40 +++++++---- .../net/sf/jabref/gui/actions/Actions.java | 1 - .../gui/exporter/SaveDatabaseAction.java | 5 +- .../sf/jabref/gui/groups/GroupSelector.java | 28 +++++++- .../gui/importer/fetcher/GeneralFetcher.java | 56 +++++---------- .../gui/openoffice/OpenOfficePanel.java | 70 ++++++++----------- .../importer/fetcher/GeneralFetcherTest.java | 2 +- 11 files changed, 181 insertions(+), 144 deletions(-) diff --git a/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java b/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java index 2d2ce422f6f6..77d74c119601 100644 --- a/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java +++ b/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java @@ -68,6 +68,11 @@ public void componentClosing() { manager.unregisterComponent(FileUpdatePanel.NAME); } + @Override + public String getSidePaneName() { + return NAME; + } + @Override public int getRescalingWeight() { return 0; diff --git a/src/main/java/net/sf/jabref/gui/BasePanel.java b/src/main/java/net/sf/jabref/gui/BasePanel.java index 0e5a7002d3a8..eb5cf6fe4307 100644 --- a/src/main/java/net/sf/jabref/gui/BasePanel.java +++ b/src/main/java/net/sf/jabref/gui/BasePanel.java @@ -397,12 +397,6 @@ private void setupActions() { }); - // The action for toggling the groups interface - actions.put(Actions.TOGGLE_GROUPS, (BaseAction) () -> { - sidePaneManager.toggle("groups"); - frame.groupToggle.setSelected(sidePaneManager.isComponentVisible("groups")); - }); - actions.put(FindUnlinkedFilesDialog.ACTION_COMMAND, (BaseAction) () -> { final FindUnlinkedFilesDialog dialog = new FindUnlinkedFilesDialog(frame, frame, BasePanel.this); dialog.setLocationRelativeTo(frame); @@ -1217,7 +1211,7 @@ public void listen(EntryAddedEvent addedEntryEvent) { } // Automatically add new entry to the selected group (or set of groups) - if (Globals.prefs.getBoolean(JabRefPreferences.AUTO_ASSIGN_GROUP) && frame.groupToggle.isSelected()) { + if (Globals.prefs.getBoolean(JabRefPreferences.AUTO_ASSIGN_GROUP) && frame.getGroupSelector().getAction().isSelected()) { final List entries = Collections.singletonList(addedEntryEvent.getBibEntry()); final TreePath[] selection = frame.getGroupSelector().getGroupsTree().getSelectionPaths(); if (selection != null) { @@ -2160,7 +2154,7 @@ public void fileUpdated() { } FileUpdatePanel pan = new FileUpdatePanel(BasePanel.this, sidePaneManager, getBibDatabaseContext().getDatabaseFile().orElse(null), scanner); - sidePaneManager.register(FileUpdatePanel.NAME, pan); + sidePaneManager.register(pan); sidePaneManager.show(FileUpdatePanel.NAME); }; @@ -2185,10 +2179,10 @@ public void cleanUp() { } // Check if there is a FileUpdatePanel for this BasePanel being shown. If so, // remove it: - if (sidePaneManager.hasComponent("fileUpdate")) { - FileUpdatePanel fup = (FileUpdatePanel) sidePaneManager.getComponent("fileUpdate"); + if (sidePaneManager.hasComponent(FileUpdatePanel.NAME)) { + FileUpdatePanel fup = (FileUpdatePanel) sidePaneManager.getComponent(FileUpdatePanel.NAME); if (fup.getPanel() == this) { - sidePaneManager.hideComponent("fileUpdate"); + sidePaneManager.hideComponent(FileUpdatePanel.NAME); } } } diff --git a/src/main/java/net/sf/jabref/gui/JabRefFrame.java b/src/main/java/net/sf/jabref/gui/JabRefFrame.java index 79f16202ae32..375b20606d29 100644 --- a/src/main/java/net/sf/jabref/gui/JabRefFrame.java +++ b/src/main/java/net/sf/jabref/gui/JabRefFrame.java @@ -190,11 +190,7 @@ public class JabRefFrame extends JFrame implements OutputPrinter { // for the name and message strings. /* References to the toggle buttons in the toolbar */ - // the groups interface - public JToggleButton groupToggle; private JToggleButton previewToggle; - private JToggleButton fetcherToggle; - private final OpenDatabaseAction open = new OpenDatabaseAction(this, true); private final EditModeAction editModeAction = new EditModeAction(); @@ -351,11 +347,6 @@ public void actionPerformed(ActionEvent e) { } }); - private final Action toggleGroups = enableToggle(new GeneralAction(Actions.TOGGLE_GROUPS, - Localization.menuTitle("Toggle groups interface"), - Localization.lang("Toggle groups interface"), - Globals.getKeyPrefs().getKey(KeyBinding.TOGGLE_GROUPS_INTERFACE), - IconTheme.JabRefIcon.TOGGLE_GROUPS.getIcon())); private final AbstractAction addToGroup = new GeneralAction(Actions.ADD_TO_GROUP, Localization.lang("Add to group") + ELLIPSES); private final AbstractAction removeFromGroup = new GeneralAction(Actions.REMOVE_FROM_GROUP, Localization.lang("Remove from group") + ELLIPSES); @@ -394,8 +385,6 @@ public void actionPerformed(ActionEvent e) { Localization.lang("Will write XMP-metadata to the PDFs linked from selected entries."), Globals.getKeyPrefs().getKey(KeyBinding.WRITE_XMP)); - private JMenuItem optMenuItem; - private final AbstractAction openFolder = new GeneralAction(Actions.OPEN_FOLDER, Localization.menuTitle("Open folder"), Localization.lang("Open folder"), Globals.getKeyPrefs().getKey(KeyBinding.OPEN_FOLDER)); @@ -481,7 +470,7 @@ public void actionPerformed(ActionEvent e) { private PushToApplications pushApplications; private GeneralFetcher generalFetcher; - + private OpenOfficePanel openOfficePanel; private GroupSelector groupSelector; private int previousTabCount = -1; @@ -662,9 +651,10 @@ public void windowClosing(WindowEvent e) { currentBasePanel.getPreviewPanel().updateLayout(); - groupToggle.setSelected(sidePaneManager.isComponentVisible("groups")); + groupSelector.getAction().setSelected(sidePaneManager.isComponentVisible(GroupSelector.NAME)); previewToggle.setSelected(Globals.prefs.getPreviewPreferences().isPreviewPanelEnabled()); - fetcherToggle.setSelected(sidePaneManager.isComponentVisible(generalFetcher.getTitle())); + generalFetcher.getAction().setSelected(sidePaneManager.isComponentVisible(GeneralFetcher.NAME)); + openOfficePanel.getAction().setSelected(sidePaneManager.isComponentVisible(OpenOfficePanel.NAME)); Globals.getFocusListener().setFocused(currentBasePanel.getMainTable()); setWindowTitle(); editModeAction.initName(); @@ -724,10 +714,10 @@ private void initSidePane() { sidePaneManager = new SidePaneManager(this); groupSelector = new GroupSelector(this, sidePaneManager); + openOfficePanel = new OpenOfficePanel(this, sidePaneManager); + generalFetcher = new GeneralFetcher(this, sidePaneManager); - generalFetcher = new GeneralFetcher(sidePaneManager, this); - - sidePaneManager.register("groups", groupSelector); + sidePaneManager.register(groupSelector); } /** @@ -1228,12 +1218,12 @@ private void fillMenu() { search.addSeparator(); search.add(new JCheckBoxMenuItem(generalFetcher.getAction())); if (prefs.getBoolean(JabRefPreferences.WEB_SEARCH_VISIBLE)) { - sidePaneManager.register(generalFetcher.getTitle(), generalFetcher); - sidePaneManager.show(generalFetcher.getTitle()); + sidePaneManager.register(generalFetcher); + sidePaneManager.show(GeneralFetcher.NAME); } mb.add(search); - groups.add(new JCheckBoxMenuItem(toggleGroups)); + groups.add(new JCheckBoxMenuItem(groupSelector.getAction())); groups.addSeparator(); groups.add(addToGroup); groups.add(removeFromGroup); @@ -1273,7 +1263,7 @@ private void fillMenu() { view.addSeparator(); view.add(new JCheckBoxMenuItem(toggleToolbar)); view.add(new JCheckBoxMenuItem(enableToggle(generalFetcher.getAction()))); - view.add(new JCheckBoxMenuItem(toggleGroups)); + view.add(new JCheckBoxMenuItem(groupSelector.getAction())); view.add(new JCheckBoxMenuItem(togglePreview)); view.add(getNextPreviewStyleAction()); view.add(getPreviousPreviewStyleAction()); @@ -1314,10 +1304,7 @@ private void fillMenu() { tools.add(newSubDatabaseAction); tools.add(writeXmpAction); - OpenOfficePanel otp = OpenOfficePanel.getInstance(); - otp.init(this, sidePaneManager); - optMenuItem = otp.getMenuItem(); - tools.add(optMenuItem); + tools.add(new JCheckBoxMenuItem(openOfficePanel.getAction())); tools.add(pushExternalButton.getMenuAction()); tools.addSeparator(); tools.add(openFolder); @@ -1475,14 +1462,12 @@ private void createToolBar() { } tlb.addSeparator(); - fetcherToggle = new JToggleButton(generalFetcher.getAction()); - tlb.addJToggleButton(fetcherToggle); + tlb.addJToggleButton(new JToggleButton(generalFetcher.getAction())); previewToggle = new JToggleButton(togglePreview); tlb.addJToggleButton(previewToggle); - groupToggle = new JToggleButton(toggleGroups); - tlb.addJToggleButton(groupToggle); + tlb.addJToggleButton(new JToggleButton(groupSelector.getAction())); tlb.addSeparator(); @@ -1509,8 +1494,8 @@ private void initActions() { openDatabaseOnlyActions.addAll(Arrays.asList(mergeDatabaseAction, newSubDatabaseAction, save, globalSearch, saveAs, saveSelectedAs, saveSelectedAsPlain, editModeAction, undo, redo, cut, deleteEntry, copy, paste, mark, markSpecific, unmark, unmarkAll, rankSubMenu, editEntry, selectAll, copyKey, copyCiteKey, copyKeyAndTitle, copyKeyAndLink, editPreamble, editStrings, - toggleGroups, makeKeyAction, normalSearch, generalFetcher.getAction(), mergeEntries, cleanupEntries, exportToClipboard, replaceAll, - sendAsEmail, downloadFullText, writeXmpAction, optMenuItem, findUnlinkedFiles, addToGroup, removeFromGroup, + groupSelector.getAction(), makeKeyAction, normalSearch, generalFetcher.getAction(), mergeEntries, cleanupEntries, exportToClipboard, replaceAll, + sendAsEmail, downloadFullText, writeXmpAction, openOfficePanel.getAction(), findUnlinkedFiles, addToGroup, removeFromGroup, moveToGroup, autoLinkFile, resolveDuplicateKeys, openUrl, openFolder, openFile, togglePreview, dupliCheck, autoSetFile, newEntryAction, newSpec, customizeAction, plainTextImport, getMassSetField(), getManageKeywords(), pushExternalButton.getMenuAction(), closeDatabaseAction, getNextPreviewStyleAction(), getPreviousPreviewStyleAction(), checkIntegrity, @@ -2378,10 +2363,6 @@ public GroupSelector getGroupSelector() { return groupSelector; } - public void setFetcherToggle(boolean enabled) { - fetcherToggle.setSelected(enabled); - } - public void setPreviewToggle(boolean enabled) { previewToggle.setSelected(enabled); } diff --git a/src/main/java/net/sf/jabref/gui/SidePaneComponent.java b/src/main/java/net/sf/jabref/gui/SidePaneComponent.java index 3ed6190bde55..4b9a953b8d52 100644 --- a/src/main/java/net/sf/jabref/gui/SidePaneComponent.java +++ b/src/main/java/net/sf/jabref/gui/SidePaneComponent.java @@ -3,12 +3,17 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import javax.swing.AbstractAction; +import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JToolBar; +import javax.swing.KeyStroke; import org.jdesktop.swingx.JXTitledPanel; import org.jdesktop.swingx.painter.MattePainter; @@ -17,7 +22,7 @@ public abstract class SidePaneComponent extends JXTitledPanel { protected final JButton close = new JButton(IconTheme.JabRefIcon.CLOSE.getSmallIcon()); - private final SidePaneManager manager; + protected final SidePaneManager manager; protected BasePanel panel; @@ -95,9 +100,53 @@ public Dimension getMinimumSize() { return getPreferredSize(); } + public abstract String getSidePaneName(); + /** * Specifies how to distribute extra vertical space between side pane components. * 0: fixed height, 1: fill the remaining space */ public abstract int getRescalingWeight(); + + + public class ToggleAction extends AbstractAction { + + public ToggleAction(String text, String description, KeyStroke key, IconTheme.JabRefIcon icon){ + super(text, icon.getSmallIcon()); + putValue(Action.ACCELERATOR_KEY, key); + putValue(Action.LARGE_ICON_KEY, icon.getIcon()); + putValue(Action.SHORT_DESCRIPTION, description); + } + + public ToggleAction(String text, String description, KeyStroke key, Icon icon){ + super(text, icon); + putValue(Action.ACCELERATOR_KEY, key); + putValue(Action.SHORT_DESCRIPTION, description); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (!manager.hasComponent(getSidePaneName())) { + manager.register(SidePaneComponent.this); + } + + // if clicked by mouse just toggle + if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { + manager.toggle(getSidePaneName()); + } else { + manager.toggleThreeWay(getSidePaneName()); + } + putValue(Action.SELECTED_KEY, manager.isComponentVisible(getSidePaneName())); + } + + public void setSelected(boolean selected){ + putValue(Action.SELECTED_KEY, selected); + } + + public boolean isSelected() { + return Boolean.TRUE.equals(getValue(Action.SELECTED_KEY)); + } + + } + } diff --git a/src/main/java/net/sf/jabref/gui/SidePaneManager.java b/src/main/java/net/sf/jabref/gui/SidePaneManager.java index 7e3febe55c48..eb4575f72ec0 100644 --- a/src/main/java/net/sf/jabref/gui/SidePaneManager.java +++ b/src/main/java/net/sf/jabref/gui/SidePaneManager.java @@ -32,7 +32,6 @@ public class SidePaneManager { private final SidePane sidep; private final Map components = new LinkedHashMap<>(); - private final Map componentNames = new HashMap<>(); private final List visible = new LinkedList<>(); @@ -67,6 +66,11 @@ public synchronized boolean isComponentVisible(String name) { } } + /** + * if panel is visible it will be hidden and the other way around + * + * @param name name of the panel + */ public synchronized void toggle(String name) { if (isComponentVisible(name)) { hide(name); @@ -75,6 +79,21 @@ public synchronized void toggle(String name) { } } + /** + * if panel is hidden it will be shown and focused + * if panel is visible but not focused it will be focused + * ig panel is visible and focused it will be hidden + * + * @param name name of the panel + */ + public synchronized void toggleThreeWay(String name){ + if (isComponentVisible(name) && Globals.getFocusListener().getFocused() == components.get(name)) { + hide(name); + } else { + show(name); + } + } + public synchronized void show(String name) { SidePaneComponent sidePaneComponent = components.get(name); if (sidePaneComponent == null) { @@ -98,9 +117,8 @@ public synchronized void hide(String name) { } } - public synchronized void register(String name, SidePaneComponent comp) { - components.put(name, comp); - componentNames.put(comp, name); + public synchronized void register(SidePaneComponent comp) { + components.put(comp.getSidePaneName(), comp); } private synchronized void show(SidePaneComponent component) { @@ -114,16 +132,14 @@ private synchronized void show(SidePaneComponent component) { updateView(); component.componentOpening(); } + Globals.getFocusListener().setFocused(component); + component.grabFocus(); } public synchronized SidePaneComponent getComponent(String name) { return components.get(name); } - private synchronized String getComponentName(SidePaneComponent comp) { - return componentNames.get(comp); - } - public synchronized void hideComponent(SidePaneComponent comp) { if (visible.contains(comp)) { comp.componentClosing(); @@ -168,8 +184,7 @@ private void updatePreferredPositions() { // Update the preferred positions of all visible components int index = 0; for (SidePaneComponent comp : visible) { - String componentName = getComponentName(comp); - preferredPositions.put(componentName, index); + preferredPositions.put(comp.getSidePaneName(), index); index++; } @@ -195,8 +210,8 @@ public PreferredIndexSort() { @Override public int compare(SidePaneComponent comp1, SidePaneComponent comp2) { - int pos1 = preferredPositions.getOrDefault(getComponentName(comp1), 0); - int pos2 = preferredPositions.getOrDefault(getComponentName(comp2), 0); + int pos1 = preferredPositions.getOrDefault(comp1.getSidePaneName(), 0); + int pos2 = preferredPositions.getOrDefault(comp2.getSidePaneName(), 0); return Integer.valueOf(pos1).compareTo(pos2); } } @@ -231,7 +246,6 @@ public synchronized void moveDown(SidePaneComponent comp) { } public synchronized void unregisterComponent(String name) { - componentNames.remove(components.get(name)); components.remove(name); } diff --git a/src/main/java/net/sf/jabref/gui/actions/Actions.java b/src/main/java/net/sf/jabref/gui/actions/Actions.java index 58c9e70a3f07..6013786b746b 100644 --- a/src/main/java/net/sf/jabref/gui/actions/Actions.java +++ b/src/main/java/net/sf/jabref/gui/actions/Actions.java @@ -60,7 +60,6 @@ public class Actions { public static final String TOGGLE_HIGHLIGHTS_GROUPS_MATCHING_DISABLE = "toggleHighlightGroupsMatchingDisable"; public static final String TOGGLE_GROUPS = "toggleGroups"; public static final String TOGGLE_PREVIEW = "togglePreview"; - public static final String TOGGLE_TOOLBAR = "toggleToolbar"; public static final String UNABBREVIATE = "unabbreviate"; public static final String UNDO = "undo"; public static final String UNMARK_ALL = "unmarkAll"; diff --git a/src/main/java/net/sf/jabref/gui/exporter/SaveDatabaseAction.java b/src/main/java/net/sf/jabref/gui/exporter/SaveDatabaseAction.java index 4e9ae8294422..3e90cbf1cfde 100644 --- a/src/main/java/net/sf/jabref/gui/exporter/SaveDatabaseAction.java +++ b/src/main/java/net/sf/jabref/gui/exporter/SaveDatabaseAction.java @@ -14,6 +14,7 @@ import net.sf.jabref.Globals; import net.sf.jabref.JabRefExecutorService; import net.sf.jabref.collab.ChangeScanner; +import net.sf.jabref.collab.FileUpdatePanel; import net.sf.jabref.gui.BasePanel; import net.sf.jabref.gui.FileDialog; import net.sf.jabref.gui.JabRefFrame; @@ -381,7 +382,7 @@ private boolean checkExternalModification() { scanner.displayResult(resolved -> { if (resolved) { panel.setUpdatedExternally(false); - SwingUtilities.invokeLater(() -> panel.getSidePaneManager().hide("fileUpdate")); + SwingUtilities.invokeLater(() -> panel.getSidePaneManager().hide(FileUpdatePanel.NAME)); } else { canceled = true; } @@ -399,7 +400,7 @@ private boolean checkExternalModification() { canceled = true; } else { panel.setUpdatedExternally(false); - panel.getSidePaneManager().hide("fileUpdate"); + panel.getSidePaneManager().hide(FileUpdatePanel.NAME); } } } diff --git a/src/main/java/net/sf/jabref/gui/groups/GroupSelector.java b/src/main/java/net/sf/jabref/gui/groups/GroupSelector.java index 957d4c08e767..40af9dec0b74 100644 --- a/src/main/java/net/sf/jabref/gui/groups/GroupSelector.java +++ b/src/main/java/net/sf/jabref/gui/groups/GroupSelector.java @@ -50,6 +50,7 @@ import net.sf.jabref.gui.SidePaneComponent; import net.sf.jabref.gui.SidePaneManager; import net.sf.jabref.gui.help.HelpAction; +import net.sf.jabref.gui.keyboard.KeyBinding; import net.sf.jabref.gui.maintable.MainTableDataModel; import net.sf.jabref.gui.undo.NamedCompound; import net.sf.jabref.gui.worker.AbstractWorker; @@ -79,6 +80,7 @@ public class GroupSelector extends SidePaneComponent implements TreeSelectionListener { private static final Log LOGGER = LogFactory.getLog(GroupSelector.class); + public static final String NAME = "groups"; private final GroupsTree groupsTree; private DefaultTreeModel groupsTreeModel; @@ -125,6 +127,8 @@ public class GroupSelector extends SidePaneComponent implements TreeSelectionLis private final AddToGroupAction moveToGroup = new AddToGroupAction(true); private final RemoveFromGroupAction removeFromGroup = new RemoveFromGroupAction(); + private ToggleAction toggleAction; + /** * The first element for each group defines which field to use for the quicksearch. The next two define the name and @@ -133,6 +137,11 @@ public class GroupSelector extends SidePaneComponent implements TreeSelectionLis public GroupSelector(JabRefFrame frame, SidePaneManager manager) { super(manager, IconTheme.JabRefIcon.TOGGLE_GROUPS.getIcon(), Localization.lang("Groups")); + toggleAction = new ToggleAction(Localization.menuTitle("Toggle groups interface"), + Localization.menuTitle("Toggle groups interface"), + Globals.getKeyPrefs().getKey(KeyBinding.TOGGLE_GROUPS_INTERFACE), + IconTheme.JabRefIcon.TOGGLE_GROUPS); + this.frame = frame; hideNonHits = new JRadioButtonMenuItem(Localization.lang("Hide non-hits"), !Globals.prefs.getBoolean(JabRefPreferences.GRAY_OUT_NON_HITS)); @@ -701,6 +710,11 @@ public void componentOpening() { valueChanged(null); } + @Override + public String getSidePaneName() { + return NAME; + } + @Override public int getRescalingWeight() { return 1; @@ -711,7 +725,7 @@ public void componentClosing() { if (panel != null) {// panel may be null if no file is open any more panel.getMainTable().getTableModel().updateGroupingState(MainTableDataModel.DisplayOption.DISABLED); } - frame.groupToggle.setSelected(false); + getAction().setSelected(false); } private void setGroups(GroupTreeNode groupsRoot) { @@ -1212,7 +1226,7 @@ public Enumeration getExpandedPaths() { public void setActiveBasePanel(BasePanel panel) { super.setActiveBasePanel(panel); if (panel == null) { // hide groups - frame.getSidePaneManager().hide("groups"); + frame.getSidePaneManager().hide(NAME); return; } MetaData metaData = panel.getBibDatabaseContext().getMetaData(); @@ -1269,4 +1283,14 @@ public GroupsTree getGroupsTree() { public void listen(GroupUpdatedEvent updateEvent) { setGroups(updateEvent.getMetaData().getGroups().orElse(null)); } + + @Override + public void grabFocus() { + groupsTree.grabFocus(); + } + + public ToggleAction getAction() { + return toggleAction; + } + } diff --git a/src/main/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcher.java b/src/main/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcher.java index 5d95de989268..9dd398a352a9 100644 --- a/src/main/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcher.java +++ b/src/main/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcher.java @@ -12,8 +12,6 @@ import java.util.Comparator; import java.util.List; -import javax.swing.AbstractAction; -import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; @@ -38,21 +36,21 @@ public class GeneralFetcher extends SidePaneComponent implements ActionListener { + public final static String NAME = "fetcher"; + private final JTextField tf = new JTextField(); private final CardLayout optionsCards = new CardLayout(); private final JPanel optionsPanel = new JPanel(optionsCards); private final JPanel optPanel = new JPanel(new BorderLayout()); - private final SidePaneManager sidePaneManager; - private final Action action; + private final ToggleAction action; private final JabRefFrame frame; private EntryFetcher activeFetcher; - public GeneralFetcher(SidePaneManager p0, JabRefFrame frame) { - super(p0, IconTheme.JabRefIcon.WWW.getSmallIcon(), Localization.lang("Web search")); - this.sidePaneManager = p0; + public GeneralFetcher(JabRefFrame frame, SidePaneManager sidePaneManager) { + super(sidePaneManager, IconTheme.JabRefIcon.WWW.getSmallIcon(), Localization.lang("Web search")); this.frame = frame; List fetchers = new EntryFetchers(Globals.journalAbbreviationLoader).getEntryFetchers(); EntryFetcher[] fetcherArray = fetchers.toArray(new EntryFetcher[fetchers.size()]); @@ -93,9 +91,10 @@ public GeneralFetcher(SidePaneManager p0, JabRefFrame frame) { revalidate(); }); - action = new FetcherAction(); - - + action = new ToggleAction(Localization.lang("Web search"), + Localization.lang("Toggle web search interface"), + Globals.getKeyPrefs().getKey(KeyBinding.WEB_SEARCH), + IconTheme.JabRefIcon.WWW); helpBut.setMargin(new Insets(0, 0, 0, 0)); tf.setPreferredSize(new Dimension(1, tf.getPreferredSize().height)); @@ -158,7 +157,7 @@ private JTextField getTextField() { return tf; } - public Action getAction() { + public ToggleAction getAction() { return action; } @@ -225,37 +224,15 @@ public void actionPerformed(ActionEvent e) { } } - - class FetcherAction extends AbstractAction { - - public FetcherAction() { - super(Localization.lang("Web search"), IconTheme.JabRefIcon.WWW.getSmallIcon()); - //if ((activeFetcher.getKeyName() != null) && (activeFetcher.getKeyName().length() > 0)) - putValue(Action.ACCELERATOR_KEY, Globals.getKeyPrefs().getKey(KeyBinding.WEB_SEARCH)); - putValue(Action.LARGE_ICON_KEY, IconTheme.JabRefIcon.WWW.getIcon()); - putValue(Action.SHORT_DESCRIPTION, Localization.lang("Toggle web search interface")); - } - - @Override - 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())) { - getTextField().requestFocus(); - } - } - } + @Override + public void grabFocus() { + getTextField().grabFocus(); } - @Override public void componentClosing() { super.componentClosing(); - frame.setFetcherToggle(false); + getAction().setSelected(false); Globals.prefs.putBoolean(JabRefPreferences.WEB_SEARCH_VISIBLE, Boolean.FALSE); } @@ -265,6 +242,11 @@ public void componentOpening() { Globals.prefs.putBoolean(JabRefPreferences.WEB_SEARCH_VISIBLE, Boolean.TRUE); } + @Override + public String getSidePaneName() { + return NAME; + } + @Override public int getRescalingWeight() { return 0; diff --git a/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficePanel.java b/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficePanel.java index 30746dab9f95..15f38664cad5 100644 --- a/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficePanel.java +++ b/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficePanel.java @@ -81,8 +81,9 @@ public class OpenOfficePanel extends AbstractWorker { private static final Log LOGGER = LogFactory.getLog(OpenOfficePanel.class); + public static final String NAME = "OpenOffice/LibreOffice"; - private OOPanel comp; + private OOPanel sidePane; private JDialog diag; private final JButton connect; private final JButton manualConnect; @@ -101,7 +102,6 @@ public class OpenOfficePanel extends AbstractWorker { HelpFile.OPENOFFICE_LIBREOFFICE).getHelpButton(); private OOBibBase ooBase; private JabRefFrame frame; - private SidePaneManager manager; private OOBibStyle style; private StyleSelectDialog styleDialog; private boolean dialogOkPressed; @@ -114,7 +114,7 @@ public class OpenOfficePanel extends AbstractWorker { private static OpenOfficePanel instance; - private OpenOfficePanel() { + public OpenOfficePanel(JabRefFrame jabRefFrame, SidePaneManager spManager) { Icon connectImage = IconTheme.JabRefIcon.CONNECT_OPEN_OFFICE.getSmallIcon(); connect = new JButton(connectImage); @@ -134,36 +134,11 @@ private OpenOfficePanel() { loader = new StyleLoader(preferences, Globals.prefs.getLayoutFormatterPreferences(Globals.journalAbbreviationLoader), Globals.prefs.getDefaultEncoding()); - } - public static OpenOfficePanel getInstance() { - if (OpenOfficePanel.instance == null) { - OpenOfficePanel.instance = new OpenOfficePanel(); - } - return OpenOfficePanel.instance; - } - - public SidePaneComponent getSidePaneComponent() { - return comp; - } - - public void init(JabRefFrame jabRefFrame, SidePaneManager spManager) { this.frame = jabRefFrame; - this.manager = spManager; - comp = new OOPanel(spManager, IconTheme.getImage("openoffice"), "OpenOffice/LibreOffice", this); + sidePane = new OOPanel(spManager, IconTheme.getImage("openoffice"), "OpenOffice/LibreOffice"); initPanel(); - spManager.register(getName(), comp); - } - - public JMenuItem getMenuItem() { - if (preferences.showPanel()) { - manager.show(getName()); - } - JMenuItem item = new JMenuItem(Localization.lang("OpenOffice/LibreOffice connection"), - IconTheme.getImage("openoffice")); - item.addActionListener(event -> manager.show(getName())); - item.setAccelerator(Globals.getKeyPrefs().getKey(KeyBinding.OPEN_OPEN_OFFICE_LIBRE_OFFICE_CONNECTION)); - return item; + spManager.register(sidePane); } private void initPanel() { @@ -326,7 +301,7 @@ public void actionPerformed(ActionEvent e) { mainBuilder.add(settingsB).xy(1, 10); JPanel content = new JPanel(); - comp.setContentContainer(content); + sidePane.setContentContainer(content); content.setLayout(new BorderLayout()); content.add(mainBuilder.getPanel(), BorderLayout.CENTER); @@ -804,24 +779,27 @@ private void showSettingsPopup() { menu.show(settingsB, 0, settingsB.getHeight()); } - public String getName() { - return "OpenOffice/LibreOffice"; + public SidePaneComponent.ToggleAction getAction() { + return sidePane.getToggleAction(); } private class OOPanel extends SidePaneComponent { - private final OpenOfficePanel openOfficePanel; + private final ToggleAction toggleAction; - public OOPanel(SidePaneManager sidePaneManager, Icon url, String s, OpenOfficePanel panel) { - super(sidePaneManager, url, s); - openOfficePanel = panel; - } + public OOPanel(SidePaneManager sidePaneManager, Icon icon, String title) { + super(sidePaneManager, icon, title); + sidePaneManager.register(this); + if (preferences.showPanel()) { + manager.show(NAME); + } - @Override - public String getName() { - return openOfficePanel.getName(); + toggleAction = new ToggleAction(Localization.lang("OpenOffice/LibreOffice connection"), + Localization.lang("OpenOffice/LibreOffice connection"), + Globals.getKeyPrefs().getKey(KeyBinding.OPEN_OPEN_OFFICE_LIBRE_OFFICE_CONNECTION), + icon); } @Override @@ -834,10 +812,20 @@ public void componentOpening() { preferences.setShowPanel(true); } + @Override + public String getSidePaneName() { + return NAME; + } + @Override public int getRescalingWeight() { return 0; } + + public ToggleAction getToggleAction() { + return toggleAction; + } + } } diff --git a/src/test/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcherTest.java b/src/test/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcherTest.java index 5bdb204928c7..04860cf805ad 100644 --- a/src/test/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcherTest.java +++ b/src/test/java/net/sf/jabref/gui/importer/fetcher/GeneralFetcherTest.java @@ -61,7 +61,7 @@ public void setUp() { GeneralFetcherTest.acmpf = new ACMPortalFetcher(); ArrayList al = new ArrayList<>(); al.add(GeneralFetcherTest.acmpf); - GeneralFetcherTest.gf = new GeneralFetcher(GeneralFetcherTest.spm, GeneralFetcherTest.jrf); + GeneralFetcherTest.gf = new GeneralFetcher(GeneralFetcherTest.jrf, GeneralFetcherTest.spm); } @After