package org.yamcs.ui.archivebrowser;
import org.yamcs.ui.UiColors;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* For switching between NavigatorItems.
*/
public class SideNavigator extends JPanel implements MouseListener {
private static final long serialVersionUID = 1L;
private ArchivePanel archivePanel;
private JPanel itemLabelsPanel;
public SideNavigator(ArchivePanel archivePanel) {
super(new BorderLayout());
this.archivePanel = archivePanel;
// Borders
Border outsideBorder = BorderFactory.createMatteBorder(0, 0, 0, 1, UiColors.BORDER_COLOR);
Border insideBorder = BorderFactory.createEmptyBorder(10, 0, 10, 0);
setBorder(BorderFactory.createCompoundBorder(outsideBorder, insideBorder));
// Container for Navigation items
itemLabelsPanel = new JPanel(new GridBagLayout());
// Put items on top and fill with emptiness
add(itemLabelsPanel, BorderLayout.NORTH);
add(new JPanel(), BorderLayout.CENTER);
}
public void addItem(String name, int indent, NavigatorItem navigatorItem) {
NavigatorItemLabel item = new NavigatorItemLabel(name, navigatorItem, indent);
item.addMouseListener(this);
GridBagConstraints cons = new GridBagConstraints();
cons.fill = GridBagConstraints.HORIZONTAL;
cons.weightx = 1;
cons.gridx = 0;
itemLabelsPanel.add(item, cons);
}
public void updateActiveItem(NavigatorItem targetItem) {
for(int i=0;i< itemLabelsPanel.getComponentCount();i++) {
Component component = itemLabelsPanel.getComponent(i);
if (component instanceof NavigatorItemLabel) {
NavigatorItemLabel label = ((NavigatorItemLabel) component);
label.toggleState(label.getText().equals(targetItem.getLabelName()));
}
}
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getSource() instanceof NavigatorItemLabel) {
NavigatorItemLabel lbl = (NavigatorItemLabel) e.getSource();
archivePanel.fireIntentionToSwitchActiveItem(lbl.getNavigatorItem());
}
}
@Override public void mouseClicked(MouseEvent e) {}
@Override public void mouseReleased(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mouseExited(MouseEvent e) {}
/**
* A button-like JLabel for inclusion in the side-navigator
* Can be toggled on and off.
*/
private static class NavigatorItemLabel extends JLabel {
private static final long serialVersionUID = 1L;
private final Color defaultBackground;
private boolean on = false;
private final NavigatorItem navigatorItem; // To be opened when on-click
/**
* @param indent multiplier for left indentation
*/
public NavigatorItemLabel(String label, NavigatorItem navigatorItem, int indent) {
super(label);
this.navigatorItem = navigatorItem;
int lpad = 10 + indent * 10;
setBorder(BorderFactory.createEmptyBorder(3, lpad, 3, 10));
defaultBackground = getBackground();
setOpaque(true);
setBackground(defaultBackground);
}
public NavigatorItem getNavigatorItem() {
return navigatorItem;
}
public void toggleState(boolean on) {
if (on && !this.on) {
setBackground(UiColors.BORDER_COLOR);
} else if (!on && this.on) {
setDefaultBackground();
}
this.on = on;
}
public void setDefaultBackground() {
setBackground(defaultBackground);
}
}
}