package org.jabref.gui; 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.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.jabref.gui.actions.MnemonicAwareAction; import org.jdesktop.swingx.JXTitledPanel; import org.jdesktop.swingx.painter.MattePainter; public abstract class SidePaneComponent extends JXTitledPanel { protected final JButton close = new JButton(IconTheme.JabRefIcon.CLOSE.getSmallIcon()); protected final SidePaneManager manager; protected BasePanel panel; public SidePaneComponent(SidePaneManager manager, Icon icon, String title) { super(title); this.manager = manager; this.add(new JLabel(icon)); setTitleForeground(new Color(79, 95, 143)); setBorder(BorderFactory.createEmptyBorder()); close.setMargin(new Insets(0, 0, 0, 0)); close.setBorder(null); close.addActionListener(e -> hideAway()); JButton up = new JButton(IconTheme.JabRefIcon.UP.getSmallIcon()); up.setMargin(new Insets(0, 0, 0, 0)); up.setBorder(null); up.addActionListener(e -> moveUp()); JButton down = new JButton(IconTheme.JabRefIcon.DOWN.getSmallIcon()); down.setMargin(new Insets(0, 0, 0, 0)); down.setBorder(null); down.addActionListener(e -> moveDown()); JToolBar tlb = new OSXCompatibleToolbar(); tlb.add(up); tlb.add(down); tlb.add(close); tlb.setOpaque(false); tlb.setFloatable(false); this.getUI().getTitleBar().add(tlb); setTitlePainter(new MattePainter(Color.lightGray)); } private void hideAway() { manager.hideComponent(this); } private void moveUp() { manager.moveUp(this); } private void moveDown() { manager.moveDown(this); } public void setActiveBasePanel(BasePanel panel) { this.panel = panel; } public BasePanel getActiveBasePanel() { return panel; } /** * Override this method if the component needs to make any changes before it can close. */ public void componentClosing() { // Nothing right now } /** * Override this method if the component needs to do any actions when opening. */ public void componentOpening() { // Nothing right now } @Override public Dimension getMinimumSize() { return getPreferredSize(); } /** * Specifies how to distribute extra vertical space between side pane components. * 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 MnemonicAwareAction { public ToggleAction(String text, String description, KeyStroke key, IconTheme.JabRefIcon icon) { super(icon.getIcon()); putValue(Action.NAME, text); putValue(Action.ACCELERATOR_KEY, key); putValue(Action.SHORT_DESCRIPTION, description); } public ToggleAction(String text, String description, KeyStroke key, Icon icon) { super(icon); putValue(Action.NAME, text); 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)); } } }