package com.isti.xmax.gui; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.JLabel; import javax.swing.BorderFactory; import javax.swing.border.BevelBorder; import java.awt.Dimension; import javax.swing.BoxLayout; import org.apache.log4j.Logger; import com.isti.traceview.filters.IFilter; import com.isti.traceview.gui.IColorModeState; import com.isti.traceview.gui.IMeanState; import com.isti.traceview.gui.IOffsetState; import com.isti.traceview.gui.IScaleModeState; import com.isti.traceview.gui.GraphPanel.GraphPanelObservable; import java.awt.ComponentOrientation; import java.awt.Font; import java.util.Observable; import java.util.Observer; /** * <p> * Status bar in the bottom of main frame. * </p> * <p> * Realize observer pattern, i.e watch for registered object changing and reflect changes. * </p> * * @author Max Kokoulin */ public class StatusBar extends JPanel implements Observer { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(StatusBar.class); @SuppressWarnings("unused") private Font font = null; private JLabel channelCountLabel = null; private JLabel messageLabel = null; private JLabel pickLabel = null; private JLabel filterLabel = null; private JLabel ovrLabel = null; private JLabel selLabel = null; private JLabel scaleModeLabel = null; /** * Default constructor */ public StatusBar() { super(); Font defaultFont = this.getFont(); font = new Font(defaultFont.getName(), defaultFont.getStyle(), 10); initialize(); } /** * This method initializes this status bar */ private void initialize() { channelCountLabel = new JLabel(); channelCountLabel.setHorizontalAlignment(SwingConstants.CENTER); channelCountLabel.setText("0-0 of 0"); channelCountLabel.setPreferredSize(new Dimension(60, 18)); channelCountLabel.setMinimumSize(new Dimension(60, 18)); channelCountLabel.setMaximumSize(new Dimension(60, 18)); channelCountLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); channelCountLabel.setToolTipText("Shown channels count"); messageLabel = new JLabel(); messageLabel.setHorizontalAlignment(SwingConstants.LEFT); messageLabel.setText(""); messageLabel.setPreferredSize(new Dimension(100, 18)); messageLabel.setMinimumSize(new Dimension(200, 18)); messageLabel.setMaximumSize(new Dimension(100000, 18)); messageLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); pickLabel = new JLabel(); pickLabel.setHorizontalAlignment(SwingConstants.CENTER); pickLabel.setText(""); pickLabel.setPreferredSize(new Dimension(50, 18)); pickLabel.setMinimumSize(new Dimension(50, 18)); pickLabel.setMaximumSize(new Dimension(50, 18)); pickLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); pickLabel.setToolTipText("Pick mode state"); filterLabel = new JLabel(); filterLabel.setHorizontalAlignment(SwingConstants.CENTER); filterLabel.setText("NONE"); filterLabel.setPreferredSize(new Dimension(50, 18)); filterLabel.setMinimumSize(new Dimension(50, 18)); filterLabel.setMaximumSize(new Dimension(50, 18)); filterLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); filterLabel.setToolTipText("Current filter"); ovrLabel = new JLabel(); ovrLabel.setHorizontalAlignment(SwingConstants.CENTER); ovrLabel.setText(""); ovrLabel.setMaximumSize(new Dimension(40, 18)); ovrLabel.setMinimumSize(new Dimension(40, 18)); ovrLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); ovrLabel.setPreferredSize(new Dimension(40, 18)); ovrLabel.setToolTipText("Overlay mode state"); selLabel = new JLabel(); selLabel.setHorizontalAlignment(SwingConstants.CENTER); selLabel.setText(""); selLabel.setMaximumSize(new Dimension(40, 18)); selLabel.setMinimumSize(new Dimension(40, 18)); selLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); selLabel.setPreferredSize(new Dimension(40, 18)); selLabel.setToolTipText("Select mode state"); scaleModeLabel = new JLabel(); scaleModeLabel.setHorizontalAlignment(SwingConstants.CENTER); scaleModeLabel.setText(""); scaleModeLabel.setMaximumSize(new Dimension(50, 18)); scaleModeLabel.setMinimumSize(new Dimension(50, 18)); scaleModeLabel.setPreferredSize(new Dimension(50, 18)); scaleModeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); scaleModeLabel.setToolTipText("Current scale mode"); this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); this.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); this.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); this.setPreferredSize(new Dimension(200, 20)); this.add(channelCountLabel, null); this.add(messageLabel, null); this.add(scaleModeLabel, null); this.add(filterLabel, null); this.add(pickLabel, null); this.add(ovrLabel, null); this.add(selLabel, null); } public void update(Observable o, Object arg) { if (o instanceof GraphPanelObservable) { logger.debug("updating status bar due to request from " + o.getClass().getName()); if (arg instanceof IScaleModeState) { scaleModeLabel.setText(((IScaleModeState) arg).getStateName()); } else if (arg instanceof IOffsetState) { } else if (arg instanceof IMeanState) { } else if (arg instanceof IColorModeState) { } else if ((arg instanceof IFilter) || (arg == null)) { if (arg == null) { filterLabel.setText("NONE"); } else { filterLabel.setText(((IFilter) arg).getName()); } } else if (arg instanceof String) { String message = (String) arg; if (message.equals("PICK ON")) { pickLabel.setText("PICK"); } else if (message.equals("PICK OFF")) { pickLabel.setText(""); } else if (message.equals("OVR ON")) { ovrLabel.setText("OVR"); } else if (message.equals("OVR OFF")) { ovrLabel.setText(""); } else if (message.equals("SEL ON")) { selLabel.setText("SEL"); } else if (message.equals("SEL OFF")) { selLabel.setText(""); } else if (message.startsWith("ROT")) { } } } } /** * Set information message */ public void setMessage(String message) { messageLabel.setText(message); } /** * Sets channel counter values * * @param start * number of first shown trace * @param end * number of last shown trace * @param all * total traces */ public void setChannelCountMessage(int start, int end, int all) { String text = new Integer(start).toString() + "-" + new Integer(end).toString() + " of " + new Integer(all).toString(); Dimension dim = new Dimension(channelCountLabel.getFontMetrics(channelCountLabel.getFont()).stringWidth(text)+5, 18); channelCountLabel.setPreferredSize(dim); channelCountLabel.setMinimumSize(dim); channelCountLabel.setMaximumSize(dim); channelCountLabel.setText(text); } }