diff --git a/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java b/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java index 2d2ce422f6f..2694d3203df 100644 --- a/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java +++ b/src/main/java/net/sf/jabref/collab/FileUpdatePanel.java @@ -17,10 +17,7 @@ import net.sf.jabref.gui.SidePaneManager; import net.sf.jabref.logic.l10n.Localization; -public class FileUpdatePanel extends SidePaneComponent implements ActionListener, - ChangeScanner.DisplayResultCallback { - - public static final String NAME = "fileUpdate"; +public class FileUpdatePanel extends SidePaneComponent implements ActionListener, ChangeScanner.DisplayResultCallback { private final SidePaneManager manager; @@ -65,7 +62,7 @@ public BasePanel getPanel() { */ @Override public void componentClosing() { - manager.unregisterComponent(FileUpdatePanel.NAME); + manager.unregisterComponent(FileUpdatePanel.class); } @Override @@ -73,6 +70,11 @@ public int getRescalingWeight() { return 0; } + @Override + public ToggleAction getToggleAction() { + throw new UnsupportedOperationException(); + } + /** * actionPerformed * diff --git a/src/main/java/net/sf/jabref/gui/BasePanel.java b/src/main/java/net/sf/jabref/gui/BasePanel.java index 2fd4836610c..84bb79e315d 100644 --- a/src/main/java/net/sf/jabref/gui/BasePanel.java +++ b/src/main/java/net/sf/jabref/gui/BasePanel.java @@ -395,12 +395,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().getToggleAction().isSelected()) { final List entries = Collections.singletonList(addedEntryEvent.getBibEntry()); final TreePath[] selection = frame.getGroupSelector().getGroupsTree().getSelectionPaths(); if (selection != null) { @@ -2117,15 +2111,15 @@ public void fileUpdated() { // Check if there is already a notification about external // changes: - boolean hasAlready = sidePaneManager.hasComponent(FileUpdatePanel.NAME); + boolean hasAlready = sidePaneManager.hasComponent(FileUpdatePanel.class); if (hasAlready) { - sidePaneManager.hideComponent(FileUpdatePanel.NAME); - sidePaneManager.unregisterComponent(FileUpdatePanel.NAME); + sidePaneManager.hideComponent(FileUpdatePanel.class); + sidePaneManager.unregisterComponent(FileUpdatePanel.class); } FileUpdatePanel pan = new FileUpdatePanel(BasePanel.this, sidePaneManager, getBibDatabaseContext().getDatabaseFile().orElse(null), scanner); - sidePaneManager.register(FileUpdatePanel.NAME, pan); - sidePaneManager.show(FileUpdatePanel.NAME); + sidePaneManager.register(pan); + sidePaneManager.show(FileUpdatePanel.class); }; if (scanner.changesFound()) { @@ -2149,10 +2143,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.class)) { + FileUpdatePanel fup = (FileUpdatePanel) sidePaneManager.getComponent(FileUpdatePanel.class); if (fup.getPanel() == this) { - sidePaneManager.hideComponent("fileUpdate"); + sidePaneManager.hideComponent(FileUpdatePanel.class); } } } diff --git a/src/main/java/net/sf/jabref/gui/JabRefFrame.java b/src/main/java/net/sf/jabref/gui/JabRefFrame.java index 42f50fa6445..52a36e1cf92 100644 --- a/src/main/java/net/sf/jabref/gui/JabRefFrame.java +++ b/src/main/java/net/sf/jabref/gui/JabRefFrame.java @@ -99,6 +99,7 @@ import net.sf.jabref.gui.menus.FileHistoryMenu; import net.sf.jabref.gui.menus.RightClickMenu; import net.sf.jabref.gui.openoffice.OpenOfficePanel; +import net.sf.jabref.gui.openoffice.OpenOfficeSidePanel; import net.sf.jabref.gui.preftabs.PreferencesDialog; import net.sf.jabref.gui.protectedterms.ProtectedTermsDialog; import net.sf.jabref.gui.push.PushToApplicationButton; @@ -190,11 +191,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 +348,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 +386,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 +471,7 @@ public void actionPerformed(ActionEvent e) { private PushToApplications pushApplications; private GeneralFetcher generalFetcher; - + private OpenOfficePanel openOfficePanel; private GroupSelector groupSelector; private int previousTabCount = -1; @@ -661,9 +651,10 @@ public void windowClosing(WindowEvent e) { currentBasePanel.getPreviewPanel().updateLayout(); - groupToggle.setSelected(sidePaneManager.isComponentVisible("groups")); + groupSelector.getToggleAction().setSelected(sidePaneManager.isComponentVisible(GroupSelector.class)); previewToggle.setSelected(Globals.prefs.getPreviewPreferences().isPreviewPanelEnabled()); - fetcherToggle.setSelected(sidePaneManager.isComponentVisible(generalFetcher.getTitle())); + generalFetcher.getToggleAction().setSelected(sidePaneManager.isComponentVisible(GeneralFetcher.class)); + openOfficePanel.getToggleAction().setSelected(sidePaneManager.isComponentVisible(OpenOfficeSidePanel.class)); Globals.getFocusListener().setFocused(currentBasePanel.getMainTable()); setWindowTitle(); editModeAction.initName(); @@ -723,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); } /** @@ -1235,14 +1226,14 @@ private void fillMenu() { search.add(normalSearch); search.add(replaceAll); search.addSeparator(); - search.add(new JCheckBoxMenuItem(generalFetcher.getAction())); + search.add(new JCheckBoxMenuItem(generalFetcher.getToggleAction())); if (prefs.getBoolean(JabRefPreferences.WEB_SEARCH_VISIBLE)) { - sidePaneManager.register(generalFetcher.getTitle(), generalFetcher); - sidePaneManager.show(generalFetcher.getTitle()); + sidePaneManager.register(generalFetcher); + sidePaneManager.show(GeneralFetcher.class); } mb.add(search); - groups.add(new JCheckBoxMenuItem(toggleGroups)); + groups.add(new JCheckBoxMenuItem(groupSelector.getToggleAction())); groups.addSeparator(); groups.add(addToGroup); groups.add(removeFromGroup); @@ -1282,8 +1273,8 @@ private void fillMenu() { view.add(decreseFontSize); view.addSeparator(); view.add(new JCheckBoxMenuItem(toggleToolbar)); - view.add(new JCheckBoxMenuItem(enableToggle(generalFetcher.getAction()))); - view.add(new JCheckBoxMenuItem(toggleGroups)); + view.add(new JCheckBoxMenuItem(enableToggle(generalFetcher.getToggleAction()))); + view.add(new JCheckBoxMenuItem(groupSelector.getToggleAction())); view.add(new JCheckBoxMenuItem(togglePreview)); view.add(getNextPreviewStyleAction()); view.add(getPreviousPreviewStyleAction()); @@ -1324,10 +1315,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.getToggleAction())); tools.add(pushExternalButton.getMenuAction()); tools.addSeparator(); tools.add(openFolder); @@ -1485,14 +1473,12 @@ private void createToolBar() { } tlb.addSeparator(); - fetcherToggle = new JToggleButton(generalFetcher.getAction()); - tlb.addJToggleButton(fetcherToggle); + tlb.addJToggleButton(new JToggleButton(generalFetcher.getToggleAction())); previewToggle = new JToggleButton(togglePreview); tlb.addJToggleButton(previewToggle); - groupToggle = new JToggleButton(toggleGroups); - tlb.addJToggleButton(groupToggle); + tlb.addJToggleButton(new JToggleButton(groupSelector.getToggleAction())); tlb.addSeparator(); @@ -1519,8 +1505,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.getToggleAction(), makeKeyAction, normalSearch, generalFetcher.getToggleAction(), mergeEntries, cleanupEntries, exportToClipboard, replaceAll, + sendAsEmail, downloadFullText, writeXmpAction, openOfficePanel.getToggleAction(), findUnlinkedFiles, addToGroup, removeFromGroup, moveToGroup, autoLinkFile, resolveDuplicateKeys, openUrl, openFolder, openFile, togglePreview, dupliCheck, autoSetFile, newEntryAction, newSpec, customizeAction, plainTextImport, getMassSetField(), getManageKeywords(), pushExternalButton.getMenuAction(), closeDatabaseAction, getNextPreviewStyleAction(), getPreviousPreviewStyleAction(), checkIntegrity, @@ -2381,10 +2367,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 3ed6190bde5..c3514399502 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; @@ -100,4 +105,51 @@ public Dimension getMinimumSize() { * 0: fixed height, 1: fill the remaining space */ public abstract int getRescalingWeight(); + + /** + * @return the action which toggles this {@link SidePaneComponent} + */ + public abstract ToggleAction getToggleAction(); + + + 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(SidePaneComponent.this.getClass())) { + manager.register(SidePaneComponent.this); + } + + // if clicked by mouse just toggle + if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { + manager.toggle(SidePaneComponent.this.getClass()); + } else { + manager.toggleThreeWay(SidePaneComponent.this.getClass()); + } + putValue(Action.SELECTED_KEY, manager.isComponentVisible(SidePaneComponent.this.getClass())); + } + + 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 7e3febe55c4..92df0599a86 100644 --- a/src/main/java/net/sf/jabref/gui/SidePaneManager.java +++ b/src/main/java/net/sf/jabref/gui/SidePaneManager.java @@ -1,6 +1,5 @@ package net.sf.jabref.gui; -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -31,8 +30,7 @@ public class SidePaneManager { private final SidePane sidep; - private final Map components = new LinkedHashMap<>(); - private final Map componentNames = new HashMap<>(); + private final Map, SidePaneComponent> components = new LinkedHashMap<>(); private final List visible = new LinkedList<>(); @@ -54,42 +52,59 @@ public SidePane getPanel() { return sidep; } - public synchronized boolean hasComponent(String name) { - return components.containsKey(name); + public synchronized boolean hasComponent(Class sidePaneComponent) { + return components.containsKey(sidePaneComponent); } - public synchronized boolean isComponentVisible(String name) { - SidePaneComponent sidePaneComponent = components.get(name); - if (sidePaneComponent == null) { + public synchronized boolean isComponentVisible(Class sidePaneComponent) { + SidePaneComponent component = components.get(sidePaneComponent); + if (component == null) { return false; } else { - return visible.contains(sidePaneComponent); + return visible.contains(component); } } - public synchronized void toggle(String name) { - if (isComponentVisible(name)) { - hide(name); + /** + * If panel is visible it will be hidden and the other way around + */ + public synchronized void toggle(Class sidePaneComponent) { + if (isComponentVisible(sidePaneComponent)) { + hide(sidePaneComponent); } else { - show(name); + show(sidePaneComponent); } } - public synchronized void show(String name) { - SidePaneComponent sidePaneComponent = components.get(name); - if (sidePaneComponent == null) { - LOGGER.warn("Side pane component '" + name + "' unknown."); + /** + * If panel is hidden it will be shown and focused + * If panel is visible but not focused it will be focused + * If panel is visible and focused it will be hidden + */ + public synchronized void toggleThreeWay(Class sidePaneComponent) { + boolean isPanelFocused = Globals.getFocusListener().getFocused() == components.get(sidePaneComponent); + if (isComponentVisible(sidePaneComponent) && isPanelFocused) { + hide(sidePaneComponent); } else { show(sidePaneComponent); } } - public synchronized void hide(String name) { - SidePaneComponent sidePaneComponent = components.get(name); - if (sidePaneComponent == null) { - LOGGER.warn("Side pane component '" + name + "' unknown."); + public synchronized void show(Class sidePaneComponent) { + SidePaneComponent component = components.get(sidePaneComponent); + if (component == null) { + LOGGER.warn("Side pane component '" + sidePaneComponent + "' unknown."); } else { - hideComponent(sidePaneComponent); + show(component); + } + } + + public synchronized void hide(Class sidePaneComponent) { + SidePaneComponent component = components.get(sidePaneComponent); + if (component == null) { + LOGGER.warn("Side pane component '" + sidePaneComponent + "' unknown."); + } else { + hideComponent(component); if (frame.getCurrentBasePanel() != null) { MainTable mainTable = frame.getCurrentBasePanel().getMainTable(); mainTable.setSelected(mainTable.getSelectedRow()); @@ -98,9 +113,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.getClass(), comp); } private synchronized void show(SidePaneComponent component) { @@ -114,14 +128,12 @@ 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 SidePaneComponent getComponent(Class sidePaneComponent) { + return components.get(sidePaneComponent); } public synchronized void hideComponent(SidePaneComponent comp) { @@ -132,30 +144,36 @@ public synchronized void hideComponent(SidePaneComponent comp) { } } - public synchronized void hideComponent(String name) { - SidePaneComponent comp = components.get(name); - if (comp == null) { + public synchronized void hideComponent(Class sidePaneComponent) { + SidePaneComponent component = components.get(sidePaneComponent); + if (component == null) { return; } - if (visible.contains(comp)) { - comp.componentClosing(); - visible.remove(comp); + if (visible.contains(component)) { + component.componentClosing(); + visible.remove(component); updateView(); } } - private static Map getPreferredPositions() { - Map preferredPositions = new HashMap<>(); + private static Map, Integer> getPreferredPositions() { + Map, Integer> preferredPositions = new HashMap<>(); List componentNames = Globals.prefs.getStringList(JabRefPreferences.SIDE_PANE_COMPONENT_NAMES); List componentPositions = Globals.prefs .getStringList(JabRefPreferences.SIDE_PANE_COMPONENT_PREFERRED_POSITIONS); for (int i = 0; i < componentNames.size(); ++i) { + String componentName = componentNames.get(i); try { - preferredPositions.put(componentNames.get(i), Integer.parseInt(componentPositions.get(i))); + Class componentClass = (Class) Class.forName(componentName); + preferredPositions.put(componentClass, Integer.parseInt(componentPositions.get(i))); + } catch (ClassNotFoundException e) { + LOGGER.error("Following side pane could not be found: " + componentName, e); + } catch (ClassCastException e) { + LOGGER.error("Following Class is no side pane: '" + componentName, e); } catch (NumberFormatException e) { - LOGGER.info("Invalid number format for side pane component '" + componentNames.get(i) + "'.", e); + LOGGER.info("Invalid number format for side pane component '" + componentName + "'.", e); } } @@ -163,18 +181,20 @@ private static Map getPreferredPositions() { } private void updatePreferredPositions() { - Map preferredPositions = getPreferredPositions(); + Map, Integer> preferredPositions = getPreferredPositions(); // 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.getClass(), index); index++; } // Split the map into a pair of parallel String lists suitable for storage - List tmpComponentNames = new ArrayList<>(preferredPositions.keySet()); + List tmpComponentNames = preferredPositions.keySet().parallelStream() + .map(Class::getName) + .collect(Collectors.toList()); + List componentPositions = preferredPositions.values().stream().map(Object::toString) .collect(Collectors.toList()); @@ -183,10 +203,12 @@ private void updatePreferredPositions() { } - // Helper class for sorting visible components based on their preferred position + /** + * Helper class for sorting visible components based on their preferred position + */ private class PreferredIndexSort implements Comparator { - private final Map preferredPositions; + private final Map, Integer> preferredPositions; public PreferredIndexSort() { @@ -195,8 +217,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.getClass(), 0); + int pos2 = preferredPositions.getOrDefault(comp2.getClass(), 0); return Integer.valueOf(pos1).compareTo(pos2); } } @@ -230,9 +252,8 @@ public synchronized void moveDown(SidePaneComponent comp) { } } - public synchronized void unregisterComponent(String name) { - componentNames.remove(components.get(name)); - components.remove(name); + public synchronized void unregisterComponent(Class sidePaneComponent) { + components.remove(sidePaneComponent); } /** @@ -241,10 +262,9 @@ public synchronized void unregisterComponent(String name) { * * @param panel */ - private synchronized void setActiveBasePanel(BasePanel panel) { - for (Map.Entry stringSidePaneComponentEntry : components.entrySet()) { - stringSidePaneComponentEntry.getValue().setActiveBasePanel(panel); + for (SidePaneComponent component : components.values()) { + component.setActiveBasePanel(panel); } } 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 58c9e70a3f0..6013786b746 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 4e9ae829442..6aadc90727d 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.class)); } else { canceled = true; } @@ -399,7 +400,7 @@ private boolean checkExternalModification() { canceled = true; } else { panel.setUpdatedExternally(false); - panel.getSidePaneManager().hide("fileUpdate"); + panel.getSidePaneManager().hide(FileUpdatePanel.class); } } } 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 6ab6044123e..dcfc5e83c06 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; @@ -125,6 +126,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 +136,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)); @@ -710,7 +718,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); + getToggleAction().setSelected(false); } private void setGroups(GroupTreeNode groupsRoot) { @@ -1204,7 +1212,7 @@ public Enumeration getExpandedPaths() { public void setActiveBasePanel(BasePanel panel) { super.setActiveBasePanel(panel); if (panel == null) { // hide groups - frame.getSidePaneManager().hide("groups"); + frame.getSidePaneManager().hide(GroupSelector.class); return; } MetaData metaData = panel.getBibDatabaseContext().getMetaData(); @@ -1261,4 +1269,15 @@ public GroupsTree getGroupsTree() { public void listen(GroupUpdatedEvent updateEvent) { setGroups(updateEvent.getMetaData().getGroups().orElse(null)); } + + @Override + public void grabFocus() { + groupsTree.grabFocus(); + } + + @Override + public ToggleAction getToggleAction() { + 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 5d95de98926..0897baad761 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; @@ -44,15 +42,13 @@ public class GeneralFetcher extends SidePaneComponent implements ActionListener 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 +89,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 +155,8 @@ private JTextField getTextField() { return tf; } - public Action getAction() { + @Override + public ToggleAction getToggleAction() { return action; } @@ -225,37 +223,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); + getToggleAction().setSelected(false); Globals.prefs.putBoolean(JabRefPreferences.WEB_SEARCH_VISIBLE, Boolean.FALSE); } 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 5934c435587..afe95fe23b6 100644 --- a/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficePanel.java +++ b/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficePanel.java @@ -82,7 +82,7 @@ public class OpenOfficePanel extends AbstractWorker { private static final Log LOGGER = LogFactory.getLog(OpenOfficePanel.class); - private OOPanel comp; + private OpenOfficeSidePanel sidePane; private JDialog diag; private final JButton connect; private final JButton manualConnect; @@ -101,7 +101,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; @@ -111,10 +110,8 @@ public class OpenOfficePanel extends AbstractWorker { private final OpenOfficePreferences preferences; private final StyleLoader loader; - 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 +131,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 OpenOfficeSidePanel(spManager, IconTheme.getImage("openoffice"), "OpenOffice/LibreOffice", preferences); 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 +298,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); @@ -806,40 +778,8 @@ private void showSettingsPopup() { menu.show(settingsB, 0, settingsB.getHeight()); } - public String getName() { - return "OpenOffice/LibreOffice"; - } - - - private class OOPanel extends SidePaneComponent { - - private final OpenOfficePanel openOfficePanel; - - - public OOPanel(SidePaneManager sidePaneManager, Icon url, String s, OpenOfficePanel panel) { - super(sidePaneManager, url, s); - openOfficePanel = panel; - } - - @Override - public String getName() { - return openOfficePanel.getName(); - } - - @Override - public void componentClosing() { - preferences.setShowPanel(false); - } - - @Override - public void componentOpening() { - preferences.setShowPanel(true); - } - - @Override - public int getRescalingWeight() { - return 0; - } + public SidePaneComponent.ToggleAction getToggleAction() { + return sidePane.getToggleAction(); } } diff --git a/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficeSidePanel.java b/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficeSidePanel.java new file mode 100644 index 00000000000..5c3797cfef2 --- /dev/null +++ b/src/main/java/net/sf/jabref/gui/openoffice/OpenOfficeSidePanel.java @@ -0,0 +1,52 @@ +package net.sf.jabref.gui.openoffice; + +import javax.swing.Icon; + +import net.sf.jabref.Globals; +import net.sf.jabref.gui.SidePaneComponent; +import net.sf.jabref.gui.SidePaneManager; +import net.sf.jabref.gui.keyboard.KeyBinding; +import net.sf.jabref.logic.l10n.Localization; +import net.sf.jabref.logic.openoffice.OpenOfficePreferences; + +public class OpenOfficeSidePanel extends SidePaneComponent { + + private OpenOfficePreferences preferences; + private final ToggleAction toggleAction; + + + public OpenOfficeSidePanel(SidePaneManager sidePaneManager, Icon icon, String title, OpenOfficePreferences preferences) { + super(sidePaneManager, icon, title); + this.preferences = preferences; + sidePaneManager.register(this); + if (preferences.showPanel()) { + manager.show(OpenOfficeSidePanel.class); + } + + 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 + public void componentClosing() { + preferences.setShowPanel(false); + } + + @Override + public void componentOpening() { + preferences.setShowPanel(true); + } + + @Override + public int getRescalingWeight() { + return 0; + } + + @Override + public ToggleAction getToggleAction() { + return toggleAction; + } + +}