/*
* ALMA - Atacama Large Millimiter Array
* (c) European Southern Observatory, 2008
*
* 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.archive.zoom;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import alma.acs.gui.util.threadsupport.EDTExecutor;
import com.cosylab.logging.LoggingClient;
import com.cosylab.logging.engine.log.LogTypeHelper;
import com.cosylab.logging.settings.LogTypeRenderer;
/**
* The dialog to set preferences for zooming
*
* @author acaproni
*
*/
public class ZoomPrefsDlg extends JDialog implements ActionListener {
/**
* The logging client
*/
private final LoggingClient loggingClient;
/**
* The manager for zooming
*/
private final ZoomManager zoomManager;
/**
* The combobox to choose minimum log level while zooming (inclusive)
*/
private JComboBox minLevelCB;
/**
* The combobox to choose maximum log level while zooming (inclusive)
*/
private JComboBox maxLevelCB;
/**
* The path of the folder to show in the label.
*/
private String folder;
/**
* The label with the folder of XML files of logs.
* <P>
* The content of the label is built from the value of
* <code>folder</code>.
*/
private JLabel folderLbl = new JLabel();
/**
* The button to choose the folder of XML files of logs
*/
private JButton folderBtn=new JButton("Change...");
/**
* The OK button
*/
private JButton okBtn = new JButton("Ok");
/**
* The Cancel button
*/
private JButton cancelBtn = new JButton("Cancel");
/**
* Constructor
*
* @param logCli The <code>LoggingClient</code>
* @param manager The manager for zooming
*/
public ZoomPrefsDlg(LoggingClient logCli,ZoomManager manager) {
if (logCli==null) {
throw new IllegalArgumentException("The LoggingClient can't be null");
}
if (manager==null) {
throw new IllegalArgumentException("The manager can't be null");
}
loggingClient=logCli;
zoomManager=manager;
folder=zoomManager.getRepository();
EDTExecutor.instance().execute(new Runnable() {
@Override
public void run() {
initialize();
pack();
setVisible(true);
}
});
}
/**
* Init the GUI
*/
private void initialize() {
// Window setup
setTitle("Drill down preferences");
ImageIcon zoomIcon = new ImageIcon(LogTypeHelper.class.getResource("/zoom.png"));
setIconImage(zoomIcon.getImage());
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// Window content setup
JPanel contentPanel = new JPanel();
contentPanel.setLayout(new BoxLayout(contentPanel,BoxLayout.Y_AXIS));
// The panel with levels
JPanel levelsPnl = new JPanel();
levelsPnl.setBorder(BorderFactory.createTitledBorder("Levels"));
levelsPnl.setLayout(new BoxLayout(levelsPnl,BoxLayout.Y_AXIS));
JPanel minPnl = new JPanel();
minPnl.add(new JLabel("Min log level to load: "));
minLevelCB=buildLogLevelCB(zoomManager.getMinLevel());
minPnl.add(minLevelCB);
levelsPnl.add(minPnl);
JPanel maxPnl = new JPanel();
maxPnl.add(new JLabel("Max log level to load: "));
maxLevelCB=buildLogLevelCB(zoomManager.getMaxLevel());
maxPnl.add(maxLevelCB);
levelsPnl.add(maxPnl);
contentPanel.add(levelsPnl);
// The panel with the folder
JPanel folderPnl = new JPanel(new BorderLayout());
folderPnl.setBorder(BorderFactory.createTitledBorder("Folder of XML files"));
folderPnl.add(folderBtn,BorderLayout.EAST);
folderBtn.addActionListener(this);
folderPnl.add(folderLbl,BorderLayout.CENTER);
setupFolderLbl();
contentPanel.add(folderPnl);
// The Ok/Cancel buttons
contentPanel.add(new JSeparator());
JPanel buttonPnl = new JPanel(new BorderLayout());
buttonPnl.add(cancelBtn,BorderLayout.WEST);
cancelBtn.addActionListener(this);
buttonPnl.add(okBtn,BorderLayout.EAST);
okBtn.addActionListener(this);
okBtn.setEnabled(folder!=null);
contentPanel.add(buttonPnl);
rootPane.setContentPane(contentPanel);
}
/**
* Build a log level combobox.
*
* @param initialLevel The initial log level
* @return The log level CB
*/
private JComboBox buildLogLevelCB(LogTypeHelper initialLevel) {
JComboBox temp;
// Add the ComboBox for the log level
LogTypeHelper[] types = LogTypeHelper.values();
int t=0;
temp = new JComboBox(types);
// Build the renderer for the combo boxes
LogTypeRenderer rendererCB = new LogTypeRenderer();
if (initialLevel!=null) {
temp.setSelectedItem(initialLevel);
} else {
temp.setSelectedItem(LogTypeHelper.TRACE);
}
temp.setEditable(false);
temp.setMaximumRowCount(LogTypeHelper.values().length);
temp.setRenderer(rendererCB);
return temp;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==okBtn) {
if (okPressed()) {
setVisible(false);
dispose();
}
} else if (e.getSource()==cancelBtn) {
setVisible(false);
dispose();
} else if (e.getSource()==folderBtn) {
JFileChooser fileChooser = new JFileChooser(folder);
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fileChooser.showOpenDialog(this);
if (returnVal==JFileChooser.APPROVE_OPTION) {
File f = fileChooser.getSelectedFile();
folder=f.getAbsolutePath();
setupFolderLbl();
}
okBtn.setEnabled(folder!=null);
} else {
System.out.println("Unknown event: "+e.getSource());
}
}
/**
* Read the values from the widgets and update
* the <code>ZoomManager</code>.
*
* @return <code>true</code> if the values has been accepted
*/
private boolean okPressed() {
try {
zoomManager.setFilesRepository(folder);
} catch (ZoomException ze) {
JOptionPane.showMessageDialog(this, "Invalid folder: "+ze.getMessage(), "Error selecting folder", JOptionPane.ERROR_MESSAGE);
return false;
}
try {
zoomManager.setLevels((LogTypeHelper)minLevelCB.getSelectedItem(), (LogTypeHelper)maxLevelCB.getSelectedItem());
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "Invalid levels", "Error setting levels", JOptionPane.ERROR_MESSAGE);
return false;
}
if (!zoomManager.isAvailable()) {
int ret=JOptionPane.showConfirmDialog(
this,
"Current setup seems wrong.\nAccept anyhow?",
"Are the values right?",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
return ret==JOptionPane.YES_OPTION;
}
return true;
}
/**
* Override <code>setVisible()</code> to move the dialog
* over the logging client and in front of other windows
*/
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
// Move the statistic win on top of jlog
if (visible && isShowing()) {
setLocationRelativeTo(loggingClient);
toFront();
}
}
/**
* Setup the content of the label depending on the parameter
*
* @param folder The path of the folder of XML files
* (can be <code>null</code>)
*/
private void setupFolderLbl() {
if (folder==null || folder.isEmpty()) {
folderLbl.setText("<UNDEFINED>");
} else {
folderLbl.setText(folder);
}
}
}