Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhance side pane toggle #1605

Merged
merged 8 commits into from
Oct 12, 2016
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/main/java/net/sf/jabref/collab/FileUpdatePanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +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 class FileUpdatePanel extends SidePaneComponent implements ActionListener, ChangeScanner.DisplayResultCallback {

public static final String NAME = "fileUpdate";

Expand Down Expand Up @@ -68,6 +67,11 @@ public void componentClosing() {
manager.unregisterComponent(FileUpdatePanel.NAME);
}

@Override
public String getSidePaneName() {
return NAME;
Copy link
Member

@tobiasdiez tobiasdiez Oct 11, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can one simply return "fileUpdate" here and replace all references to NAME with calls to getSidePaneName?
Applies also to the other side panes.
One probably needs to recode getComponent to not use the name but the class (as a generic version <T> T getComponent(Class<T> clazz))

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I used the static NAME to change the state of the side panels without having an object of it at hand.
I changed the SidePaneManager to manage the side panels in a generic way.

}

@Override
public int getRescalingWeight() {
return 0;
Expand Down
16 changes: 5 additions & 11 deletions src/main/java/net/sf/jabref/gui/BasePanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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<BibEntry> entries = Collections.singletonList(addedEntryEvent.getBibEntry());
final TreePath[] selection = frame.getGroupSelector().getGroupsTree().getSelectionPaths();
if (selection != null) {
Expand Down Expand Up @@ -2124,7 +2118,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);
};

Expand All @@ -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.NAME)) {
FileUpdatePanel fup = (FileUpdatePanel) sidePaneManager.getComponent(FileUpdatePanel.NAME);
if (fup.getPanel() == this) {
sidePaneManager.hideComponent("fileUpdate");
sidePaneManager.hideComponent(FileUpdatePanel.NAME);
}
}
}
Expand Down
51 changes: 16 additions & 35 deletions src/main/java/net/sf/jabref/gui/JabRefFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -661,9 +650,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();
Expand Down Expand Up @@ -723,10 +713,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);
}

/**
Expand Down Expand Up @@ -1237,12 +1227,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);
Expand Down Expand Up @@ -1283,7 +1273,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());
Expand Down Expand Up @@ -1324,10 +1314,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);
Expand Down Expand Up @@ -1485,14 +1472,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();

Expand All @@ -1519,8 +1504,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,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe rename getAction -> getToggleAction ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

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,
Expand Down Expand Up @@ -2381,10 +2366,6 @@ public GroupSelector getGroupSelector() {
return groupSelector;
}

public void setFetcherToggle(boolean enabled) {
fetcherToggle.setSelected(enabled);
}

public void setPreviewToggle(boolean enabled) {
previewToggle.setSelected(enabled);
}
Expand Down
51 changes: 50 additions & 1 deletion src/main/java/net/sf/jabref/gui/SidePaneComponent.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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));
}

}

}
41 changes: 28 additions & 13 deletions src/main/java/net/sf/jabref/gui/SidePaneManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ public class SidePaneManager {
private final SidePane sidep;

private final Map<String, SidePaneComponent> components = new LinkedHashMap<>();
private final Map<SidePaneComponent, String> componentNames = new HashMap<>();

private final List<SidePaneComponent> visible = new LinkedList<>();

Expand Down Expand Up @@ -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);
Expand All @@ -75,6 +79,22 @@ 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
* If panel is visible and focused it will be hidden
*
* @param name name of the panel
*/
public synchronized void toggleThreeWay(String name){
boolean isPanelFocused = Globals.getFocusListener().getFocused() == components.get(name);
if (isComponentVisible(name) && isPanelFocused) {
hide(name);
} else {
show(name);
}
}

public synchronized void show(String name) {
SidePaneComponent sidePaneComponent = components.get(name);
if (sidePaneComponent == null) {
Expand All @@ -98,9 +118,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) {
Expand All @@ -114,16 +133,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();
Expand Down Expand Up @@ -168,8 +185,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++;
}

Expand All @@ -195,8 +211,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);
}
}
Expand Down Expand Up @@ -231,7 +247,6 @@ public synchronized void moveDown(SidePaneComponent comp) {
}

public synchronized void unregisterComponent(String name) {
componentNames.remove(components.get(name));
components.remove(name);
}

Expand Down
Loading