/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.lookupoptions.gui; import org.jdom.Element; import org.openide.util.Lookup; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Hashtable; import de.cismet.lookupoptions.OptionsCategory; import de.cismet.lookupoptions.OptionsPanelController; import de.cismet.tools.configuration.Configurable; import de.cismet.tools.configuration.NoWriteError; /** * This class provides some methods for interaction between the options dialog and the OptionsCategory- and * OptionsController- LookupServices. * * @author jruiz * @version $Revision$, $Date$ */ public class OptionsClient implements Configurable { //~ Static fields/initializers --------------------------------------------- private static OptionsClient instance = new OptionsClient(); private static final String CONFIGURATION = "cismetLookupOptions"; // NOI18N //~ Instance fields -------------------------------------------------------- private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); private Hashtable<Class<? extends OptionsCategory>, OptionsCategory> categoriesTable = new Hashtable<Class<? extends OptionsCategory>, OptionsCategory>(); private ArrayList<OptionsPanelController> controllerList = new ArrayList<OptionsPanelController>(); //~ Constructors ----------------------------------------------------------- /** * Makes a lookup for option categories and controllers. */ private OptionsClient() { // Kategorien in Hashtable speichern, sodass zu jeder Kategorie-Klasse genau eine Instanz gehört. final Collection<? extends OptionsCategory> categories = Lookup.getDefault().lookupAll(OptionsCategory.class); for (final OptionsCategory category : categories) { categoriesTable.put(category.getClass(), category); } for (final OptionsPanelController controller : Lookup.getDefault().lookupAll(OptionsPanelController.class)) { if (controller.isEnabled()) { controllerList.add(controller); } } } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static OptionsClient getInstance() { return instance; } /** * Invokes the apply-method of each controller whose isChanged method returns true. This method will be invoked when * the OK-Button of the options dialog is pressed. */ public void applyAll() { // für jeden Controller for (final OptionsPanelController controller : controllerList) { // prüfen ob isChanged true ist if (controller.isChanged()) { // gegebenenfalls applyChanges aufrufen controller.applyChanges(); } } } /** * Invokes the cancel-method of each controller whose isChanged method returns true. This method will be invoked * when the Cancel-Button of the options dialog is pressed. */ public void cancelAll() { // für jeden Controller for (final OptionsPanelController controller : controllerList) { // prüfen ob isChanged true ist if (controller.isChanged()) { // gegebenenfalls cancel aufrufen controller.cancel(); } } } /** * Invokes the update-method of each controller of a category whose isChanged method returns true. This method will * be invoked when switching categories in the options dialog. * * @param categoryClass the category of the controller */ public void update(final Class<? extends OptionsCategory> categoryClass) { // für jeden Controller for (final OptionsPanelController controller : controllerList) { // prüfen ob die Kategorie mit der übergebenen übereinstimmt, und ob isChanged true ist if (controller.getCategoryClass().equals(categoryClass) && !controller.isChanged()) { // gegebenenfalls update aufrufen controller.update(); } } } /** * Returns the option categories, sorted by order. * * @return category-array, sorted by order */ public OptionsCategory[] getCategories() { // neue zu sortierte Liste mit den Werten der Original-Liste erzeugen final ArrayList<OptionsCategory> sortedCategories = new ArrayList<OptionsCategory>(categoriesTable.values()); // die neue Liste sortieren Collections.sort(sortedCategories); // Liste als Array zurückliefern return sortedCategories.toArray(new OptionsCategory[0]); } /** * DOCUMENT ME! * * @param categoryClass DOCUMENT ME! * * @return DOCUMENT ME! */ public OptionsCategory getCategory(final Class<? extends OptionsCategory> categoryClass) { return categoriesTable.get(categoryClass); } /** * Returns the optionspanel controllers of a category, sorted by order. * * @param categoryClass the options category * * @return controller-array, sorted by order */ public OptionsPanelController[] getControllers(final Class<? extends OptionsCategory> categoryClass) { // neue zu sortierte Liste erzeugen final ArrayList<OptionsPanelController> sortedPanels = new ArrayList<OptionsPanelController>(); // für jeden Wert der OriginalListe for (final OptionsPanelController controller : controllerList) { // prüfen ob die Kategorie mit der übergebenen übereinstimmt if (controller.getCategoryClass().equals(categoryClass)) { // bei Übereinstimmung den Controller der Liste hinzufügen sortedPanels.add(controller); } } // die neue Liste sortieren Collections.sort(sortedPanels); // Liste als Array zurückliefern return sortedPanels.toArray(new OptionsPanelController[0]); } /** * DOCUMENT ME! * * @param parent DOCUMENT ME! */ @Override public void configure(final Element parent) { final Element conf = parent.getChild(CONFIGURATION); // für jeden Controller for (final OptionsPanelController controller : controllerList) { controller.configure(conf); } } /** * DOCUMENT ME! * * @param parent DOCUMENT ME! */ @Override public void masterConfigure(final Element parent) { final Element conf = parent.getChild(CONFIGURATION); // für jeden Controller for (final OptionsPanelController controller : controllerList) { controller.masterConfigure(conf); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws NoWriteError DOCUMENT ME! */ @Override public Element getConfiguration() throws NoWriteError { if (log.isDebugEnabled()) { log.debug("OptionsClient.getConfiguration"); // NOI18N } final Element root = new Element(CONFIGURATION); for (final Configurable configurable : controllerList) { if (log.isDebugEnabled()) { log.debug(" - OptionsClient.getConfiguration"); // NOI18N } try { final Element element = configurable.getConfiguration(); if (element != null) { root.addContent(element); } } catch (Exception t) { log.warn("Fehler beim Schreiben der eines Konfigurationsteils.", t); // NOI18N } } return root; } }