package hep.aida.ref.plotter.style.editor;
/*
* AidaStyleEditor.java
*
* Created on June 13, 2005, 3:08 PM
*/
import hep.aida.IAnalysisFactory;
import hep.aida.IPlotterStyle;
import hep.aida.ref.xml.AidaStyleXMLReader;
import hep.aida.ref.xml.AidaStyleXMLWriter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.URL;
import java.util.Hashtable;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import com.l2fprod.common.swing.LookAndFeelTweaks;
import com.l2fprod.common.swing.plaf.LookAndFeelAddons;
/**
*
* @author The FreeHEP team @ SLAC
*/
public class AidaStyleEditor extends JFrame {
JFrame frame;
private JTabbedPane tabbedPanel;
private Class previewType;
private ConfigurePreviewPanel configurePanel;
private JFileChooser inputChooser = new JFileChooser();
private JTextField outputFile = new JTextField(30);
private JCheckBox writeSetParameters = new JCheckBox("Write Only Set Parameters");
private JFileChooser outputChooser = new JFileChooser();
private JPanel outputPanel;
private JButton outputBrowse;
private int newStyleCounter = 0;
private Hashtable files = new Hashtable();
private Image homeImage;
private JPanel homePanel;
private Logger styleLogger;
private Level logLevel;
// Set Logger and Handler level and Formatter
public static void setLoggerLevel(Logger logger, Level l) {
final String lineSeparator = System.getProperty("line.separator", "\n");
logger.setLevel(l);
Handler[] handlers = Logger.getLogger( "" ).getHandlers();
for ( int index = 0; index < handlers.length; index++ ) {
handlers[index].setLevel(l);
handlers[index].setFormatter( new SimpleFormatter() {
public String format(LogRecord record) {
long millis = record.getMillis()%1000;
String tmp = super.format(record);
tmp = tmp.replaceFirst(lineSeparator, " ["+millis+"] :: \t");
return tmp;
}
} );
}
logger.fine("Set verbose level to: "+logger.getLevel());
}
/** Creates a new instance of AidaStyleEditor */
public AidaStyleEditor() {
this("AIDA Style Editor");
}
public AidaStyleEditor(String frameName) {
super(frameName);
styleLogger = Logger.getLogger("hep.aida.ref.plotter.style.editor");
logLevel = Level.INFO;
setLoggerLevel(styleLogger, logLevel);
frame = this;
init();
pack();
setSize(700, 600);
addHomePage();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
setLocation( (d.width-getSize().width )/2, (d.height-getSize().height )/2 );
setVisible(true);
}
private void init() {
tabbedPanel = new JTabbedPane();
configurePanel = new ConfigurePreviewPanel();
createMenus();
getContentPane().setLayout(new BorderLayout());
getContentPane().add("Center", tabbedPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void createMenus() {
// FILE Menu
JMenu fileMenu = new JMenu("File");
JMenuItem item = new JMenuItem("New Style");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
newStyleAction();
}
});
fileMenu.add(item);
item = new JMenuItem("Open Style...");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
readStyleAction();
}
});
fileMenu.add(item);
item = new JMenuItem("Save Style As...");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
saveStyleAsAction();
}
});
fileMenu.add(item);
item = new JMenuItem("Close Style");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
removeSelectedTabAction();
}
});
fileMenu.add(item);
fileMenu.addSeparator();
item = new JMenuItem("Exit");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
exitAction();
}
});
fileMenu.add(item);
// VIEW Menu
JMenu viewMenu = new JMenu("View");
JMenu previewMenu = new JMenu("Set Preview Type");
viewMenu.add(previewMenu);
// Set preview type here
JRadioButtonMenuItem rbItem = null;
ButtonGroup rbGroup = new ButtonGroup();
Class[] possibleTypes = StylePreviewCreator.getPossiblePreviewTypes();
ActionListener typeListener = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
setPreviewTypeAction(evt.getActionCommand());
}
};
for (int i=0; i<possibleTypes.length; i++) {
rbItem = new JRadioButtonMenuItem(possibleTypes[i].getName());
rbItem.addActionListener(typeListener);
rbGroup.add(rbItem);
previewMenu.add(rbItem);
}
// Initial selection
((JRadioButtonMenuItem) rbGroup.getElements().nextElement()).setSelected(true);
previewType = possibleTypes[0];
item = new JMenuItem("Configure Preview...");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
configurePreviewAction();
}
});
viewMenu.add(item);
viewMenu.addSeparator();
JMenu verboseMenu = new VerboseMenu();
viewMenu.add(verboseMenu);
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
menuBar.add(viewMenu);
setJMenuBar(menuBar);
outputBrowse = new JButton("Browse...");
outputBrowse.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int returnVal = outputChooser.showOpenDialog(frame);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = outputChooser.getSelectedFile();
String fileName = file.getAbsolutePath();
outputFile.setText(fileName);
} else {
}
}
});
outputPanel = new JPanel();
writeSetParameters.setSelected(true);
outputPanel.setLayout(new java.awt.GridBagLayout());
java.awt.GridBagConstraints gbc = new java.awt.GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(2, 2, 2, 2);
gbc.gridy=0; gbc.gridx=0;
outputPanel.add(new JLabel("Output File: "), gbc);
gbc.gridx=1;
outputPanel.add(outputFile, gbc);
gbc.gridx=2;
outputPanel.add(outputBrowse, gbc);
gbc.gridy=1; gbc.gridx=1;
outputPanel.add(writeSetParameters, gbc);
}
// Menu item actions
void newStyleAction() {
IPlotterStyle style = IAnalysisFactory.create().createPlotterFactory().createPlotterStyle();
newStyleCounter++;
addTab("New Style "+newStyleCounter, style);
}
void saveStyleAsAction() {
StyleEditorPanel panel = getSelectedEditorPanel();
int index = tabbedPanel.getSelectedIndex();
if (panel == null) {
styleLogger.info("No Tab is currently selected.");
return;
}
File file = (File) files.get(panel);
IPlotterStyle style = panel.getStyle();
if (file != null) {
outputFile.setText(file.getAbsolutePath());
outputChooser.setCurrentDirectory(file.getParentFile());
}
String title = "Select Output File";
int reply = JOptionPane.showOptionDialog(frame, outputPanel, title, JOptionPane.YES_NO_OPTION, JOptionPane.DEFAULT_OPTION, null, new String[] {"Ok", "Cancel"}, "Cancel");
if (reply == JOptionPane.YES_OPTION) {
String fileName = outputFile.getText();
boolean writeAll = !writeSetParameters.isSelected();
try {
styleLogger.fine("Writing: file="+fileName+", Style="+style+", writeAll="+writeAll);
AidaStyleXMLWriter.writeToFile(fileName, style, writeAll);
if (file == null || !fileName.equals(file.getAbsoluteFile())) {
File newFile = new File(fileName);
if (file != null) files.remove(panel);
files.put(panel, newFile);
tabbedPanel.setTitleAt(index, newFile.getName());
}
} catch (Exception e) {
styleLogger.info("Can not write style to file: "+fileName);
styleLogger.log(Level.FINE, "", e);
}
} else {
return;
}
}
void readStyleAction() {
File file = null;
String fileName = null;
int returnVal = inputChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = inputChooser.getSelectedFile();
fileName = file.getAbsolutePath();
} else { return; }
try {
IPlotterStyle style = AidaStyleXMLReader.restoreFromFile(fileName);
StyleEditorPanel panel = addTab(file.getName(), style);
files.put(panel, file);
} catch (Exception e) {
styleLogger.info("Can not edit style from file: "+fileName);
styleLogger.log(Level.FINE, "", e);
}
}
void setPreviewTypeAction(String type) {
try {
previewType = Class.forName(type);
} catch (Exception e) { e.printStackTrace(); }
StyleEditorPanel panel = getSelectedEditorPanel();
if (panel == null) return;
panel.setPreviewType(previewType);
}
StyleEditorPanel getSelectedEditorPanel() {
StyleEditorPanel panel = null;
Component comp = tabbedPanel.getSelectedComponent();
if (comp instanceof StyleEditorPanel) panel = (StyleEditorPanel) comp;
return panel;
}
void configurePreviewAction() {
StyleEditorPanel panel = getSelectedEditorPanel();
String title = "Configure Preview Dialog";
boolean wrong = true;
while (wrong) {
int reply = JOptionPane.showOptionDialog(frame, configurePanel, title, JOptionPane.YES_NO_OPTION, JOptionPane.DEFAULT_OPTION, null, new String[] {"Ok", "Cancel"}, "Cancel");
if (reply == JOptionPane.YES_OPTION) {
try {
configurePanel.validateInput();
configurePanel.readInput();
if (panel != null) panel.setupEditorPanel(configurePanel);
wrong = false;
} catch (NumberFormatException e) {
String message = "Wrong input! Please correct: ";
message += "\n"+e.getMessage();
JOptionPane.showMessageDialog(frame, message, "Wrong Input", JOptionPane.DEFAULT_OPTION);
}
} else {
configurePanel.resetPanel();
wrong = false;
}
}
}
StyleEditorPanel addTab(String title, IPlotterStyle style) {
StyleEditorPanel panel = null;
try {
panel = new StyleEditorPanel(style, configurePanel, previewType);
tabbedPanel.addTab(title, null, panel, "To Save style or Close selected tab use File menu");
tabbedPanel.setSelectedComponent(panel);
} catch (Exception e) {
styleLogger.info("**** Problem with initial setup of Preview Panel Size: "+e.getMessage());
styleLogger.log(Level.FINE, "", e);
}
return panel;
}
void removeSelectedTabAction() {
StyleEditorPanel panel = getSelectedEditorPanel();
if (panel == null) {
styleLogger.fine("No Tab is currently selected.");
return;
}
tabbedPanel.remove(panel);
files.remove(panel);
panel.clear();
}
void exitAction() {
System.exit(1);
}
private void addHomePage() {
// Load image and create home panel if needed
if (homeImage == null) {
URL url = this.getClass().getResource("images/homePageImage.png");
homeImage = Toolkit.getDefaultToolkit().getImage(url);
}
if (homePanel == null) {
homePanel = new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(homeImage, 0, 0, this.getWidth(), this.getHeight(), this);
}
};
JPanel p2 = new JPanel();
p2.setMinimumSize(new Dimension(60, 200));
p2.setBackground(Color.WHITE);
GridLayout grid = new GridLayout(1, 2);
grid.setHgap(10);
p2.setLayout(grid);
final JButton newStyleButton = new JButton("New Style");
newStyleButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
newStyleAction();
}
});
final JButton openStyleButton = new JButton("Open Style");
openStyleButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
readStyleAction();
}
});
p2.add(newStyleButton);
p2.add(openStyleButton);
homePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
homePanel.add(p2, BorderLayout.PAGE_END);
homePanel.setBackground(Color.WHITE);
}
tabbedPanel.addTab("Home", homePanel);
tabbedPanel.setSelectedComponent(homePanel);
}
// Menu to set Verbose Level
public class VerboseMenu extends JMenu implements ActionListener {
public VerboseMenu() {
this("Set Verbose Level", Level.INFO);
}
public VerboseMenu(String name) {
this(name, Level.INFO);
}
public VerboseMenu(String name, Level startLevel) {
super(name);
setLoggerLevel(styleLogger, startLevel);
ButtonGroup group = new ButtonGroup();
JRadioButtonMenuItem item = new JRadioButtonMenuItem("Not Verbose");
item.setMnemonic('N');
item.addActionListener(this);
group.add(item);
add(item);
if (startLevel == Level.SEVERE) item.setSelected(true);
item = new JRadioButtonMenuItem("Verbose");
item.setMnemonic('V');
item.addActionListener(this);
group.add(item);
add(item);
if (startLevel == Level.INFO) item.setSelected(true);
item = new JRadioButtonMenuItem("Very Verbose");
item.setMnemonic('W');
item.addActionListener(this);
group.add(item);
add(item);
if (startLevel == Level.FINE) item.setSelected(true);
item = new JRadioButtonMenuItem("Debug");
item.setMnemonic('D');
item.addActionListener(this);
add(item);
group.add(item);
if (startLevel == Level.FINEST) item.setSelected(true);
}
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("Not Verbose")) {
setLoggerLevel(styleLogger, Level.SEVERE);
} else if (command.equals("Verbose")) {
setLoggerLevel(styleLogger, Level.INFO);
} else if (command.equals("Very Verbose")) {
setLoggerLevel(styleLogger, Level.FINE);
} else if (command.equals("Debug")) {
setLoggerLevel(styleLogger, Level.FINEST);
}
}
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
LookAndFeelTweaks.tweak();
LookAndFeelAddons addon = LookAndFeelAddons.getAddon();
AidaStyleEditor editor = new AidaStyleEditor();
}
}