/*
* ALMA - Atacama Large Millimiter Array
* (c) European Southern Observatory, 2002
* Copyright by ESO (in the framework of the ALMA collaboration)
* and Cosylab 2002, All rights reserved
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package alma.acs.logging.dialogs.main;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import com.cosylab.logging.engine.log.LogTypeHelper;
import com.cosylab.logging.settings.LogTypeRenderer;
/**
* The toolbar of the main window
*
* @author acaproni
*
*/
public class LogToolBar extends JToolBar {
/**
* The ComboBox in the toolbar and its default value (i.e. the log level
* at startup
*/
private JComboBox logLevelCB;
/**
* The ComboBox with the discard level in the toolbar
* (the logs with a level lower then what is shown in this ComboBox
* are discarded when read from the NC)
*/
private JComboBox discardLevelCB;
// The button to enable/disable (play/pause) the scroll lock
private JButton pauseBtn;
private boolean pauseBtnPaused; // The status of the button
private ImageIcon pauseIcon;
private ImageIcon playIcon;
public static final String pauseStr = "<HTML><FONT size=-2>Pause</FONT>";
public static final String playStr = "<HTML><FONT size=-2>Play</FONT>";
/**
* The button to delete the logs
*/
private JButton clearLogsBtn;
/**
* The button to manage filters
*/
private JButton filtersBtn;
private Boolean filtersBtnEnabledOverwrite = null;
/**
* The button for zooming
*/
private JButton zoomBtn;
/**
* The initial discard level
*/
private LogTypeHelper initialDiscardLevel;
/**
* The initial log level
*/
private LogTypeHelper initialLogLevel;
/**
* Constructor
*
* @param initialLogLvl The initial log level to set in the CB
* @param intialDiscardLvl The initial discard level to set in the COB
*/
public LogToolBar(LogTypeHelper initialLogLvl, LogTypeHelper intialDiscardLvl) {
super();
if (initialLogLvl==null) {
throw new IllegalArgumentException("The initial log level can't be null");
}
setName("LogToolBar");
initialLogLevel=initialLogLvl;
initialDiscardLevel=intialDiscardLvl;
setupToolBar();
}
/**
* Builds the toolbar
*/
private void setupToolBar() {
setFloatable(true);
// The panel for the toolbar
JPanel toolBarPanel = new JPanel();
toolBarPanel.setLayout(new BorderLayout());
// userPanel conatins the Panel with buttons, combo boxes and so on
JPanel userPanel = new JPanel();
FlowLayout tbFlowL = new FlowLayout(FlowLayout.LEFT);
tbFlowL.setHgap(10);
userPanel.setLayout(tbFlowL);
// Add the label for the log level
FlowLayout lyLevel = new FlowLayout();
lyLevel.setHgap(2);
JPanel tbLevelPanel = new JPanel(lyLevel);
JLabel logLevelLbl = new JLabel("<HTML><FONT size=-2>Log level: </FONT></HTML>");
tbLevelPanel.add(logLevelLbl);
tbLevelPanel.add(getLogLevelCB());
JLabel discardLevelLbl = new JLabel("<HTML><FONT size=-2>Discard level: </FONT></HTML>");
tbLevelPanel.add(discardLevelLbl);
tbLevelPanel.add(getDiscardLevelCB());
tbLevelPanel.add(getPauseBtn());
tbLevelPanel.add(getClearLogsBtn());
tbLevelPanel.add(getFiltersBtn());
tbLevelPanel.add(getZoomBtn());
userPanel.add(tbLevelPanel);
toolBarPanel.add(userPanel,BorderLayout.WEST);
// Rationalize the sizes ...
Dimension d = discardLevelCB.getPreferredSize();
d.height=pauseBtn.getPreferredSize().height;
discardLevelCB.setPreferredSize(d);
d= logLevelCB.getPreferredSize();
d.height=pauseBtn.getPreferredSize().height;
logLevelCB.setPreferredSize(d);
// Add the toolbar
add(toolBarPanel);
}
/**
* Set the event handler for the widgets in the toolbar
*
* @param listener The action listener
*/
public void setEventHandler(ActionListener listener) {
clearLogsBtn.addActionListener(listener);
logLevelCB.addActionListener(listener);
discardLevelCB.addActionListener(listener);
pauseBtn.addActionListener(listener);
filtersBtn.addActionListener(listener);
zoomBtn.addActionListener(listener);
}
/**
*
* @return The discard level CB
*/
public JComboBox getDiscardLevelCB() {
if (discardLevelCB==null) {
// Add the ComboBox for the log level
LogTypeRenderer discardRendererCB = new LogTypeRenderer();
String[] discardLevelStr = new String[LogTypeHelper.values().length+1];
discardLevelStr[0] = "None";
int t=0;
for (LogTypeHelper logType: LogTypeHelper.values()) {
discardLevelStr[++t]=logType.logEntryType;
}
discardLevelCB = new JComboBox(discardLevelStr);
discardLevelCB.setMaximumRowCount(discardLevelStr.length);
if (initialDiscardLevel==null) {
discardLevelCB.setSelectedIndex(0);
} else {
discardLevelCB.setSelectedIndex(initialDiscardLevel.ordinal()+1);
}
discardLevelCB.setEditable(false);
discardLevelCB.setRenderer(discardRendererCB);
}
return discardLevelCB;
}
/**
*
* @return The log level CB
*/
public JComboBox getLogLevelCB() {
if (logLevelCB==null) {
// Add the ComboBox for the log level
LogTypeHelper[] types = LogTypeHelper.values();
int t=0;
// for (LogTypeHelper logType: LogTypeHelper.values()) {
// Descriptions[t++]=logType.logEntryType;
// }
logLevelCB = new JComboBox(types);
// Build the renderer for the combo boxes
LogTypeRenderer rendererCB = new LogTypeRenderer();
logLevelCB.setSelectedItem(initialLogLevel);
logLevelCB.setEditable(false);
logLevelCB.setMaximumRowCount(LogTypeHelper.values().length);
logLevelCB.setRenderer(rendererCB);
}
return logLevelCB;
}
/**
*
* @return The button to clear the logs
*/
public JButton getClearLogsBtn() {
if (clearLogsBtn==null) {
// Add the button to delete logs
ImageIcon iconClear =new ImageIcon(LogTypeHelper.class.getResource("/delete.png"));
clearLogsBtn = new JButton("<HTML><FONT size=-2>Clear logs</FONT>",iconClear);
}
return clearLogsBtn;
}
/**
*
* @return The pause button
*/
public JButton getPauseBtn() {
if (pauseBtn==null) {
// Add the pause button
pauseIcon=new ImageIcon(LogTypeHelper.class.getResource("/pause.png"));
playIcon=new ImageIcon(LogTypeHelper.class.getResource("/play.png"));
pauseBtn = new JButton(pauseStr,pauseIcon);
pauseBtnPaused=false;
}
return pauseBtn;
}
/**
*
* @return The filter button
*/
public JButton getFiltersBtn() {
if (filtersBtn==null) {
ImageIcon filterIcon = new ImageIcon(LogTypeHelper.class.getResource("/filters.png"));
filtersBtn=new JButton("<HTML><FONT size=-2>Filters</HTML>",filterIcon);
}
return filtersBtn;
}
/**
*
* @return The zoom button
*/
public JButton getZoomBtn() {
if (zoomBtn==null) {
ImageIcon zoomIcon = new ImageIcon(LogTypeHelper.class.getResource("/zoom.png"));
zoomBtn=new JButton("<HTML><FONT size=-2>Drill down</HTML>",zoomIcon);
}
return zoomBtn;
}
/**
* The pause has been pressed
* Change the test and icon in the button.
*
* @return true if the button is in pause
*/
public boolean clickPauseBtn() {
pauseBtnPaused=!pauseBtnPaused;
if (pauseBtnPaused) {
getPauseBtn().setIcon(playIcon);
getPauseBtn().setText(playStr);
} else {
getPauseBtn().setIcon(pauseIcon);
getPauseBtn().setText(pauseStr);
}
return pauseBtnPaused;
}
/**
* Set the play/pause button in pause mode
*
* @return The status of the button previous of the command
* (true means pasused)
*/
public boolean pause() {
boolean ret=pauseBtnPaused;
pauseBtnPaused=true;
getPauseBtn().setIcon(playIcon);
getPauseBtn().setText(playStr);
return ret;
}
/**
* Unpause the play/pause button
*
* @return The status of the button previous of the command
* (true means pasused)
*/
public boolean unpause() {
boolean ret=pauseBtnPaused;
pauseBtnPaused=false;
getPauseBtn().setIcon(pauseIcon);
getPauseBtn().setText(pauseStr);
return ret;
}
/**
* Enable/Disable all the control in the GUI than can cause
* the invalidation of the logs
*
* @param enabled If true the controls are enabled
*/
@Override
public void setEnabled(boolean enabled) {
getLogLevelCB().setEnabled(enabled);
pauseBtn.setEnabled(enabled);
clearLogsBtn.setEnabled(enabled);
boolean filtersBtnEnabled = ( filtersBtnEnabledOverwrite != null ? filtersBtnEnabledOverwrite.booleanValue() : enabled );
filtersBtn.setEnabled(filtersBtnEnabled);
getDiscardLevelCB().setEnabled(enabled);
super.setEnabled(enabled);
}
/**
* This method allows to enable or disable the filters button,
* in a way that overwrites the setting from {@link #setEnabled(boolean)}.
* @param enable <code>true</code>: filtersBtn is always enabled.
* <code>false</code>: filtersBtn is always disabled.
* <code>null</code>: No overwrites for filtersBtn.
*/
public void enableFiltersButtonOverwrite(Boolean enable) {
this.filtersBtnEnabledOverwrite = enable;
}
/**
*
* @return true if the play/pause button is pressed
*/
public boolean isPaused() {
return pauseBtnPaused;
}
/**
* Set the state of the zoom button
*
* @param zoomable If <code>true</code> the zoom button is enabled.
*/
public void setZoomable(boolean zoomable) {
zoomBtn.setEnabled(zoomable);
}
}