/***************************************************************************
 SettingsDialog.java    
 -----------------------------------------------------
 begin                : jun 2004
 copyright            : (C) 2004 by Thomas Alexandre
 email                : alexthomas(at)ganttproject.org
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

package net.sourceforge.ganttproject.gui.options;

import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

import net.sourceforge.ganttproject.GanttProject;
import net.sourceforge.ganttproject.Mediator;
import net.sourceforge.ganttproject.gui.GeneralDialog;
import net.sourceforge.ganttproject.gui.options.model.OptionPageProvider;
import net.sourceforge.ganttproject.language.GanttLanguage;

/**
 * @author athomas Dialog to edit the preferences for the application.
 */
public class SettingsDialog extends GeneralDialog implements ActionListener

{

    boolean reinit = false; // If restart the initialization

    JButton restoreButton = null;

    /** Constructor. */
    public SettingsDialog(GanttProject parent) {
        super(parent, GanttProject.correctLabel(GanttLanguage.getInstance()
                .getText("settings")), true, new WelcomeSettingsPanel(parent));

        
        restoreButton = new JButton(language.getText("restoreDefaults"));
        restoreButton.setName("restore");
        restoreButton.addActionListener(this);
        if (southPanel != null) {
            southPanel.add(restoreButton);
        }
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                if (settingPanel!=null) {
                    settingPanel.rollback();
                }
            }
            
        });
    }

    /** Construct the menu settings. */
    public void constructSections() {
        addPagesFromProviders();
        DefaultMutableTreeNode projectNode = addObject(GanttProject
                .correctLabel(language.getText("project")), null);
        DefaultMutableTreeNode generalNode = addObject(language
                .getText("general"), null);
        DefaultMutableTreeNode exportNode = addObject(GanttProject
                .correctLabel(language.getText("export")), null);
        DefaultMutableTreeNode roleNode = addObject(language
                .getText("resourceRole"), null);

        // general section
        addObject(language.getText("parameters"), generalNode);
        addObject(language.getText("looknfeel"), generalNode);
        addObject(language.getText("languages"), generalNode);
        //addObject(language.getText("colors"), generalNode);

        // Export section
        // addObject ("html", exportNode);
        addObject("csv", exportNode);

        // Just to see the first level of the tree
        treeSections.scrollPathToVisible(new TreePath(projectNode.getPath()));
    }

    private void addPagesFromProviders() {
        Object[] extensions = Mediator.getPluginManager().getExtensions("net.sourceforge.ganttproject.OptionPageProvider", OptionPageProvider.class);
        for (int i=0; i<extensions.length; i++) {
            OptionPageProvider nextProvider = (OptionPageProvider) extensions[i];
            addObject(nextProvider, null);
        }
    }

    /** Callback for the tree selection event. */
    public void valueChanged(TreeSelectionEvent e) {
        if (reinit)
            return;
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) (e.getPath()
                .getLastPathComponent());
        boolean bHasChange = settingPanel.applyChanges(true);

        // construct the sections
        if ((settingPanel instanceof LanguageSettingsPanel) && bHasChange) {
            reinit = true;
            rootNode.removeAllChildren();
            treeModel.setRoot(rootNode);
            treeModel.reload();
            constructSections();
            reinit = false;
        }

        // - remove the settingPanel
        mainPanel2.remove(0);
        
        Box vb = Box.createVerticalBox();        
        Object userObject = node.getUserObject();
        if (userObject instanceof OptionPageProvider) {
            settingPanel = new OptionPageProviderPanel((OptionPageProvider) userObject, getProject(), getUIFacade());
        }
        else {

        // - ask the settingPanel if parameters are changed

        // - Create the new panel
            String sNode = (String) (node.getUserObject());
            if (sNode.equals(language.getText("languages")))
                settingPanel = new LanguageSettingsPanel(appli);
    
            else if (sNode.equals(GanttProject.correctLabel(language
                    .getText("project"))))
                settingPanel = new ProjectSettingsPanel((Frame) getOwner(),
                        getProject());
    
            else if (sNode.equals(GanttProject.correctLabel(language
                    .getText("parameters"))))
                settingPanel = new ParametersSettingsPanel(appli);
    
            else if (sNode.equals(GanttProject.correctLabel(language
                    .getText("resourceRole"))))
                settingPanel = new RolesSettingsPanel(appli);
    
            else if (sNode.equals(language.getText("looknfeel")))
                settingPanel = new LnFSettingsPanel(appli);
    
            else if (sNode.equals(GanttProject.correctLabel(language
                    .getText("export"))))
                settingPanel = new ExportSettingsPanel(appli);
    
            else if (sNode.equals("csv"))
                settingPanel = new CSVSettingsPanel(appli);
    
            else
                settingPanel = new WelcomeSettingsPanel(appli);
            vb.add(new TopPanel("  " + settingPanel.getTitle(), settingPanel
                    .getComment()));
        }    
        // - initialize the panel
        settingPanel.initialize();
        vb.add(settingPanel.getComponent());

        // - add the settingPanel into the main Panel
        mainPanel2.add(vb, 0);
        mainPanel2.repaint();
        mainPanel2.validate(); // valide the changes
    }

    public void actionPerformed(ActionEvent e) {
        super.actionPerformed(e);
        if (e.getSource() == restoreButton) {
            appli.restoreOptions();
            // refresh the current panel
            settingPanel.rollback();
        }
    }
    
    

}
