/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.lookupoptions.gui;
import com.l2fprod.common.swing.JButtonBar;
import com.l2fprod.common.swing.plaf.blue.BlueishButtonBarUI;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Hashtable;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import de.cismet.lookupoptions.OptionsCategory;
import de.cismet.lookupoptions.OptionsPanelController;
import de.cismet.tools.gui.StaticSwingTools;
/*
* OptionsDialog.java
*
* Created on 14.09.2009, 14:37:44
*/
/**
* Dialog for the LookupPanels. Uses the OptionsClient to get the categories and the panels.
*
* @author jruiz
* @version $Revision$, $Date$
*/
public class OptionsDialog extends javax.swing.JDialog implements WindowListener {
//~ Static fields/initializers ---------------------------------------------
private static final Dimension CATEGORYBUTTON_DIMENSION = new Dimension(100, 70);
//~ Instance fields --------------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private OptionsClient optionsClient = OptionsClient.getInstance();
private Hashtable<OptionsCategory, OptionsPanelController> selectedControllerPerCategory =
new Hashtable<OptionsCategory, OptionsPanelController>();
private OptionsCategory selectedCategory;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnClose;
private javax.swing.JButton btnHelp;
private javax.swing.JButton btnOk;
private javax.swing.JPanel panCategories;
private javax.swing.JPanel panCategory;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form OptionsDialog.
*
* @param parent DOCUMENT ME!
* @param modal DOCUMENT ME!
*/
public OptionsDialog(final java.awt.Frame parent, final boolean modal) {
super(parent, modal);
if (log.isDebugEnabled()) {
log.debug("OptionsDialog constructor"); // NOI18N
}
initComponents();
initOptionsPanels();
getRootPane().setDefaultButton(btnOk);
setLocationRelativeTo(parent);
addWindowListener(this);
}
//~ Methods ----------------------------------------------------------------
/**
* Inits the Category-Buttons and the LookupPanels.
*/
private void initOptionsPanels() {
final JButtonBar buttonbar = new JButtonBar(JButtonBar.HORIZONTAL);
buttonbar.setUI(new BlueishButtonBarUI());
final ButtonGroup buttonGroup = new ButtonGroup();
// Kategorien holen
final OptionsCategory[] categories = optionsClient.getCategories();
// für jede Kategorie
for (final OptionsCategory category : categories) {
final Class<? extends OptionsCategory> categoryClass = category.getClass();
// Icon und Name der Category für den Button
final Icon categoryIcon = category.getIcon();
final String categoryName = category.getName();
final String categoryTooltip = category.getTooltip();
// Klassen-Name als eindeutiger Bezeichner für die einzelnen Cards im CardLayout
final String categoryCardName = categoryClass.getCanonicalName();
if (log.isDebugEnabled()) {
log.debug("OptionsCategory: " + categoryName); // NOI18N
}
// Die OptionsController der entsprechenden Kategorie holen
final OptionsPanelController[] controllers = optionsClient.getControllers(categoryClass);
// keine leeren Kategorien anzeigen
if (controllers.length > 0) {
// Kategorie-Button erzeugen
final JToggleButton button = new JToggleButton();
button.setPreferredSize(CATEGORYBUTTON_DIMENSION);
button.setLayout(new BorderLayout());
button.add(new JLabel(categoryIcon), BorderLayout.CENTER);
button.add(new JLabel(categoryName, JLabel.CENTER), BorderLayout.SOUTH);
button.setToolTipText(categoryTooltip);
// Verhalten wenn eine Kategorie gewählt wird wird
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
// alle OptionsController der Kategorie updaten (Werte neu laden)
optionsClient.update(categoryClass);
// und dann die Card der Kategorie anzeigen
((CardLayout)panCategory.getLayout()).show(panCategory, categoryCardName);
selectedCategory = category;
selectedPanelChanged();
}
});
buttonGroup.add(button);
buttonbar.add(button);
if (selectedCategory == null) {
selectedCategory = category;
}
// prüfen ob nur ein einziger OptionsController gefunden wurde
if (controllers.length == 1) {
final OptionsPanelController controller = controllers[0];
final JPanel panel = controller.getPanel();
// falls ja, dann brauchen wir keine Tabs
panCategory.add(panel, categoryCardName);
selectedControllerPerCategory.put(category, controller);
} else if (controllers.length > 1) {
// sonst, TabbedPane erzeugen
final JTabbedPane tbpPanels = new JTabbedPane();
// für jeden OptionsController
for (final OptionsPanelController controller : controllers) {
if (selectedControllerPerCategory.get(category) == null) {
selectedControllerPerCategory.put(category, controller);
}
final String controllerName = controller.getName();
final String controllerTooltip = controller.getTooltip();
final JPanel controllerPanel = controller.getPanel();
if (log.isDebugEnabled()) {
log.debug("OptionsPanelController: " + controllerName); // NOI18N
}
// jeweils ein tab (mit title)
tbpPanels.addTab(controllerName, null, controllerPanel, controllerTooltip);
tbpPanels.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(final ChangeEvent e) {
final JTabbedPane sourceTabbedPane = (JTabbedPane)e.getSource();
if (sourceTabbedPane.getSelectedComponent() == controllerPanel) {
selectedControllerPerCategory.put(category, controller);
selectedPanelChanged();
}
}
});
}
panCategory.add(tbpPanels, categoryCardName);
}
}
}
panCategories.add(buttonbar);
// ersten button ermitteln
final JToggleButton firstButton = (JToggleButton)buttonbar.getComponent(0);
if (firstButton != null) {
// und selected setzen
buttonGroup.setSelected(firstButton.getModel(), true);
}
selectedPanelChanged();
}
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
panCategory = new javax.swing.JPanel();
btnClose = new javax.swing.JButton();
panCategories = new javax.swing.JPanel();
btnOk = new javax.swing.JButton();
btnHelp = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle(org.openide.util.NbBundle.getMessage(OptionsDialog.class, "OptionsDialog.title")); // NOI18N
panCategory.setLayout(new java.awt.CardLayout());
btnClose.setText(org.openide.util.NbBundle.getMessage(OptionsDialog.class, "OptionsDialog.btnClose.text")); // NOI18N
btnClose.setToolTipText(org.openide.util.NbBundle.getMessage(
OptionsDialog.class,
"OptionsDialog.btnClose.tooltip")); // NOI18N
btnClose.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnCloseActionPerformed(evt);
}
});
panCategories.setMaximumSize(new java.awt.Dimension(32767, 90));
panCategories.setMinimumSize(new java.awt.Dimension(10, 90));
panCategories.setLayout(new java.awt.BorderLayout());
btnOk.setText(org.openide.util.NbBundle.getMessage(OptionsDialog.class, "OptionsDialog.btnOk.text")); // NOI18N
btnOk.setToolTipText(org.openide.util.NbBundle.getMessage(OptionsDialog.class, "OptionsDialog.btnOk.tooltip")); // NOI18N
btnOk.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnOkActionPerformed(evt);
}
});
btnHelp.setText(org.openide.util.NbBundle.getMessage(OptionsDialog.class, "OptionsDialog.btnHelp.text")); // NOI18N
btnHelp.setToolTipText(org.openide.util.NbBundle.getMessage(
OptionsDialog.class,
"OptionsDialog.btnHelp.tooltip")); // NOI18N
btnHelp.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnHelpActionPerformed(evt);
}
});
final javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup().addContainerGap(336, Short.MAX_VALUE).addComponent(
btnOk,
javax.swing.GroupLayout.PREFERRED_SIZE,
80,
javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(
btnClose,
javax.swing.GroupLayout.PREFERRED_SIZE,
80,
javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(
btnHelp,
javax.swing.GroupLayout.PREFERRED_SIZE,
80,
javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap()).addComponent(
panCategories,
javax.swing.GroupLayout.DEFAULT_SIZE,
600,
Short.MAX_VALUE).addComponent(
panCategory,
javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE,
600,
Short.MAX_VALUE));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup().addComponent(
panCategories,
javax.swing.GroupLayout.PREFERRED_SIZE,
70,
javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(
panCategory,
javax.swing.GroupLayout.DEFAULT_SIZE,
371,
Short.MAX_VALUE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(btnHelp)
.addComponent(btnClose).addComponent(btnOk)).addContainerGap()));
pack();
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*/
private void selectedPanelChanged() {
final OptionsPanelController controller = selectedControllerPerCategory.get(selectedCategory);
if (controller != null) {
btnHelp.setEnabled(controller.getHelp() != null);
} else {
btnHelp.setEnabled(false);
}
}
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnCloseActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnCloseActionPerformed
try {
optionsClient.cancelAll();
} catch (Throwable t) {
if (log.isDebugEnabled()) {
log.debug("btnCloseActionPerformed", t); // NOI18N
}
} finally {
dispose();
}
} //GEN-LAST:event_btnCloseActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnOkActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnOkActionPerformed
try {
optionsClient.applyAll();
} catch (Throwable t) {
if (log.isDebugEnabled()) {
log.debug("btnOkActionPerformed", t); // NOI18N
}
} finally {
dispose();
}
} //GEN-LAST:event_btnOkActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnHelpActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnHelpActionPerformed
final OptionsPanelController controller = selectedControllerPerCategory.get(selectedCategory);
final String help = controller.getHelp();
final HelpDialog dialog = new HelpDialog((JFrame)getParent(), true);
dialog.setContent(help);
StaticSwingTools.showDialog(dialog);
} //GEN-LAST:event_btnHelpActionPerformed
/**
* DOCUMENT ME!
*
* @param args the command line arguments
*
* @throws Exception DOCUMENT ME!
*/
public static void main(final String[] args) throws Exception {
// zum Testen das gewünschte LookAndFeel
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final OptionsDialog dialog = new OptionsDialog(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(final java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
});
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
@Override
public void windowOpened(final WindowEvent e) {
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
@Override
public void windowClosing(final WindowEvent e) {
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
@Override
public void windowClosed(final WindowEvent e) {
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
@Override
public void windowIconified(final WindowEvent e) {
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
@Override
public void windowDeiconified(final WindowEvent e) {
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
@Override
public void windowActivated(final WindowEvent e) {
optionsClient.update(selectedCategory.getClass());
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
@Override
public void windowDeactivated(final WindowEvent e) {
}
}