package org.wiztools.restclient.ui.option;
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.swing.*;
import org.wiztools.restclient.IGlobalOptions;
import org.wiztools.restclient.ServiceLocator;
import org.wiztools.restclient.ui.EscapableDialog;
import org.wiztools.restclient.ui.RESTUserInterface;
import org.wiztools.restclient.ui.RESTViewImpl;
import org.wiztools.restclient.ui.UIUtil;
import org.wiztools.restclient.util.Util;
/**
*
* @author subwiz
*/
public class OptionsDialog extends EscapableDialog {
private static final Logger LOG = Logger.getLogger(OptionsDialog.class.getName());
private final Map<String, IOptionsPanel> panels = new LinkedHashMap<>();
private static final ResourceBundle rb = ResourceBundle.getBundle("org.wiztools.restclient.uioptionsdialog");
@Inject
public OptionsDialog(RESTUserInterface ui){
super(ui.getFrame(), true);
}
@PostConstruct
protected void init() {
this.setTitle("Options");
String t = rb.getString("panel");
String[] arr = t.split(",");
for(String s: arr){
String[] arrt = s.split(":");
try {
LOG.log(Level.FINEST, "OptionsPanel adding: {0}", arrt[1]);
panels.put(arrt[0], (IOptionsPanel) Class.forName(arrt[1]).newInstance());
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
// Call the init of all the panels:
for(String key: panels.keySet()){
IOptionsPanel p = panels.get(key);
p.initOptions();
}
// Tabbed pane
JTabbedPane jtp = new JTabbedPane();
jtp.setBorder(BorderFactory.createEmptyBorder(
RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH));
// Add all to tab:
for(String key: panels.keySet()){
jtp.addTab(key, UIUtil.getFlowLayoutPanelLeftAligned((JPanel)panels.get(key)));
}
// Encapsulating
JPanel jp_encp = new JPanel();
jp_encp.setBorder(BorderFactory.createEmptyBorder(
RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH));
jp_encp.setLayout(new BorderLayout(RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH));
jp_encp.add(jtp, BorderLayout.CENTER);
// South
JPanel jp_encp_south = new JPanel();
jp_encp_south.setLayout(new FlowLayout(FlowLayout.CENTER));
JButton jb_ok = new JButton("Ok");
this.getRootPane().setDefaultButton(jb_ok);
jb_ok.setMnemonic('o');
jb_ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
actionOk();
}
});
JButton jb_cancel = new JButton("Cancel");
jb_cancel.setMnemonic('c');
jb_cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
actionCancel();
}
});
jp_encp_south.add(jb_ok);
jp_encp_south.add(jb_cancel);
jp_encp.add(jp_encp_south, BorderLayout.SOUTH);
this.setContentPane(jp_encp);
pack();
// Add shutdownhook--so that options are persisted
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
writeProperties();
}
});
}
private void writeProperties(){
for(String key: panels.keySet()){
panels.get(key).shutdownOptions();
}
ServiceLocator.getInstance(IGlobalOptions.class).writeProperties();
}
@Override
public void doEscape(AWTEvent event) {
actionCancel();
}
private void actionOk(){
List<String> errors = new ArrayList<>();
for(String key: panels.keySet()){
List<String> t = panels.get(key).validateInput();
if(t != null){
errors.addAll(t);
}
}
if(errors.size() > 0){
final String errStr = Util.getHTMLListFromList(errors);
JOptionPane.showMessageDialog(this,
errStr,
"Error in input.",
JOptionPane.ERROR_MESSAGE);
return;
}
// Save the options
for(String key: panels.keySet()){
panels.get(key).saveOptions();
}
this.setVisible(false);
}
private void actionCancel(){
// Revert all the options
for(String key: panels.keySet()){
panels.get(key).revertOptions();
}
// Finally, hide:
this.setVisible(false);
}
}