/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ro.nextreports.designer;

import java.util.List;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import ro.nextreports.designer.action.BackToParentAction;
import ro.nextreports.designer.action.ExitAction;
import ro.nextreports.designer.action.OpenFromServerAction;
import ro.nextreports.designer.action.OpenLayoutPerspectiveAction;
import ro.nextreports.designer.action.PublishAction;
import ro.nextreports.designer.action.SaveAction;
import ro.nextreports.designer.action.SaveAsAction;
import ro.nextreports.designer.action.chart.ImportChartAction;
import ro.nextreports.designer.action.chart.NewChartAction;
import ro.nextreports.designer.action.chart.NewChartFromQueryAction;
import ro.nextreports.designer.action.chart.OpenChartAction;
import ro.nextreports.designer.action.datasource.AddDataSourceAction;
import ro.nextreports.designer.action.datasource.ExportDataSourceAction;
import ro.nextreports.designer.action.datasource.ImportDataSourceAction;
import ro.nextreports.designer.action.favorites.FavoriteEntry;
import ro.nextreports.designer.action.favorites.FavoritesUtil;
import ro.nextreports.designer.action.favorites.ManageFavoritesAction;
import ro.nextreports.designer.action.favorites.OpenFavoriteAction;
import ro.nextreports.designer.action.help.AboutAction;
import ro.nextreports.designer.action.help.CheckForUpdateAction;
import ro.nextreports.designer.action.help.HelpManualAction;
import ro.nextreports.designer.action.help.HelpMovieAction;
import ro.nextreports.designer.action.help.HelpStartupAction;
import ro.nextreports.designer.action.help.SurveyAction;
import ro.nextreports.designer.action.query.ImportQueryAction;
import ro.nextreports.designer.action.query.NewQueryAction;
import ro.nextreports.designer.action.query.OpenQueryAction;
import ro.nextreports.designer.action.query.OpenQueryPerspectiveAction;
import ro.nextreports.designer.action.report.ImportReportAction;
import ro.nextreports.designer.action.report.NewReportAction;
import ro.nextreports.designer.action.report.NewReportFromQueryAction;
import ro.nextreports.designer.action.report.OpenReportAction;
import ro.nextreports.designer.action.report.ViewReportSqlAction;
import ro.nextreports.designer.action.report.WizardAction;
import ro.nextreports.designer.action.tools.BackupAction;
import ro.nextreports.designer.action.tools.ImportAction;
import ro.nextreports.designer.action.tools.Language;
import ro.nextreports.designer.action.tools.LanguageAction;
import ro.nextreports.designer.action.tools.RestoreAction;
import ro.nextreports.designer.action.tools.RestoreDockingAction;
import ro.nextreports.designer.action.tools.SettingsAction;
import ro.nextreports.designer.datasource.DefaultDataSourceManager;
import ro.nextreports.designer.i18n.action.ManageI18NAction;
import ro.nextreports.designer.template.report.action.ApplyTemplateAction;
import ro.nextreports.designer.template.report.action.CreateTemplateAction;
import ro.nextreports.designer.template.report.action.ExtractTemplateAction;
import ro.nextreports.designer.template.report.action.ModifyTemplateAction;
import ro.nextreports.designer.util.I18NSupport;
import ro.nextreports.designer.util.ShortcutsUtil;
import ro.nextreports.engine.exporter.ResultExporter;

import com.jgoodies.looks.HeaderStyle;
import com.jgoodies.looks.Options;
import com.thoughtworks.xstream.XStream;

/**
 * @author Decebal Suiu
 */
public class MainMenuBar extends JMenuBar {

	private static final long serialVersionUID = 1L;
	
	private AddDataSourceAction addDataSourceAction = new AddDataSourceAction(false);
    private ExportDataSourceAction exportDataSourceAction = new ExportDataSourceAction(false);
    private ImportDataSourceAction importDataSourceAction = new ImportDataSourceAction(false);
    private WizardAction wizardAction = new WizardAction(Globals.getMainFrame().getQueryBuilderPanel().getTree());
    private NewQueryAction newQueryAction = new NewQueryAction(false);
    private OpenQueryAction openQueryAction = new OpenQueryAction(false);
    private NewReportAction newReportAction = new NewReportAction(false);
    private NewReportFromQueryAction newReportFromQueryAction = new NewReportFromQueryAction(null, null, false, ResultExporter.DEFAULT_TYPE);
    private OpenReportAction openReportAction = new OpenReportAction(false);
    private OpenFromServerAction openFromServerAction = new OpenFromServerAction();
    private PublishAction publishAction = new PublishAction();
    private ExitAction exitAction = new ExitAction();
    private BackupAction backupAction = new BackupAction();
    private RestoreAction restoreAction = new RestoreAction();
    private ImportAction importAction = new ImportAction();
    private SettingsAction settingsAction = new SettingsAction();
    private ViewReportSqlAction viewReportSqlAction = new ViewReportSqlAction();
    private ImportReportAction importReportAction = new ImportReportAction(false);
    private ImportQueryAction importQueryAction = new ImportQueryAction(false);
    private ApplyTemplateAction applyTemplateAction = new ApplyTemplateAction(true);
    private ExtractTemplateAction extractTemplateAction = new ExtractTemplateAction();
    private OpenLayoutPerspectiveAction openLayoutPersAction = new OpenLayoutPerspectiveAction();
    private ManageI18NAction manageI18nAction = new ManageI18NAction();
    private NewChartAction newChartAction = new NewChartAction(false);
    private OpenChartAction openChartAction = new OpenChartAction(false);
    private NewChartFromQueryAction newChartFromQueryAction = new NewChartFromQueryAction(null, false);
    private ImportChartAction importChartAction = new ImportChartAction(false);
    private SaveAction saveAction = new SaveAction();
    private SaveAsAction saveAsAction = new SaveAsAction();
    private BackToParentAction backAction = new BackToParentAction();
    private JMenu menuFavorites = new JMenu(I18NSupport.getString("menu_favorites"));

    public MainMenuBar() {
        putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
        add(createFileMenu());        
        add(createViewsMenu());
        add(createToolsMenu());
        add(createHelpMenu());
        actionUpdate(Globals.getConnection() != null);
        Globals.setMainMenuBar(this);
    }

    public void newChartActionUpdate() {
        publishAction.setEnabled(true);
    }

    public void newReportActionUpdate() {
        applyTemplateAction.setEnabled(true);
        extractTemplateAction.setEnabled(true);
        publishAction.setEnabled(true);
    }

    public void newQueryActionUpdate() {
        applyTemplateAction.setEnabled(false);
        extractTemplateAction.setEnabled(false);
        publishAction.setEnabled(false);
    }

    public void actionUpdate(boolean connected) {
        openQueryAction.setEnabled(connected);
        importQueryAction.setEnabled(connected);
        newReportAction.setEnabled(connected);
        newReportFromQueryAction.setEnabled(connected);
        openReportAction.setEnabled(connected);
        importReportAction.setEnabled(connected);
        openFromServerAction.setEnabled(connected);
        newChartAction.setEnabled(connected);
        openChartAction.setEnabled(connected);
        newChartFromQueryAction.setEnabled(connected);
        importChartAction.setEnabled(connected);
        saveAction.setEnabled(connected);
        saveAsAction.setEnabled(connected);
    }

    public void enableLayoutPerspective(boolean enable) {
        openLayoutPersAction.setEnabled(enable);
        manageI18nAction.setEnabled(enable);
    }

    private JMenu createFileMenu() {
        JMenu mnu = new JMenu(I18NSupport.getString("menu.file"));
        mnu.setMnemonic(ShortcutsUtil.getMnemonic("menu.file.mnemonic", new Integer('F')));

        JMenu mnu1 = new JMenu(I18NSupport.getString("menu_new"));
        mnu1.add(addDataSourceAction);
        mnu1.add(newQueryAction);
        mnu1.add(newReportAction);
        mnu1.add(newReportFromQueryAction);
        mnu1.add(newChartAction);
        mnu1.add(newChartFromQueryAction);               
        mnu.add(mnu1);

        JMenu mnu2 = new JMenu(I18NSupport.getString("menu_open"));
        mnu2.add(openQueryAction);
        mnu2.add(openReportAction);
        mnu2.add(openChartAction);
        mnu2.addSeparator();
        backAction.setEnabled(false);
        mnu2.add(backAction);
        mnu.add(mnu2);

        JMenu mnu3 = new JMenu(I18NSupport.getString("menu_import"));
        if (!DefaultDataSourceManager.memoryDataSources()) {
            mnu3.add(importDataSourceAction);
        }
        mnu3.add(importQueryAction);
        mnu3.add(importReportAction);
        mnu3.add(importChartAction);
        mnu.add(mnu3);


        JMenu mnu4 = new JMenu(I18NSupport.getString("menu_export"));
        if (!DefaultDataSourceManager.memoryDataSources()) {
            mnu4.add(exportDataSourceAction);
            mnu.add(mnu4);
        }
        
        mnu.addSeparator();
        menuFavorites = new JMenu(I18NSupport.getString("menu_favorites"));
        recreateMenuFavorites();
        mnu.add(menuFavorites);

        mnu.addSeparator();
        mnu.add(saveAction);
        mnu.add(saveAsAction);
        mnu.addSeparator();
        mnu.add(exitAction);
        newQueryActionUpdate();
        return mnu;
    }
    
    public void recreateMenuFavorites() {
    	menuFavorites.removeAll();
    	XStream xstream = FavoritesUtil.createXStream();			
 		List<FavoriteEntry> favorites = FavoritesUtil.loadFavorites(xstream);
 		for (FavoriteEntry fav : favorites) {
 			menuFavorites.add(new OpenFavoriteAction(fav));
 		}    
 		menuFavorites.addSeparator();
 		menuFavorites.add(new ManageFavoritesAction());
    }

    private JMenu createViewsMenu() {
        JMenu perspectiveMenu = new JMenu(I18NSupport.getString("menu.perpective"));
        perspectiveMenu.setMnemonic(ShortcutsUtil.getMnemonic("menu.perspective.mnemonic", new Integer('P')));

        JMenuItem item = new JMenuItem(new OpenQueryPerspectiveAction());
        perspectiveMenu.add(item);

        item = new JMenuItem(openLayoutPersAction);
        enableLayoutPerspective(false);
        perspectiveMenu.add(item);

        return perspectiveMenu;
    }

    private JMenu createHelpMenu() {
        JMenu mnu = new JMenu(I18NSupport.getString("menu.help"));
        mnu.setMnemonic(ShortcutsUtil.getMnemonic("menu.help.mnemonic", new Integer('H')));
        
        mnu.add(new CheckForUpdateAction());
        mnu.addSeparator();
        mnu.add(new HelpMovieAction());
        mnu.add(new HelpManualAction());
        mnu.add(new HelpStartupAction());
        mnu.addSeparator();
        mnu.add(new SurveyAction());
        mnu.add(new AboutAction());
        
        return mnu;
    }

    private JMenu createToolsMenu() {
        JMenu mnu = new JMenu(I18NSupport.getString("menu.tools"));
        mnu.setMnemonic(ShortcutsUtil.getMnemonic("menu.tools.mnemonic", new Integer('T')));
        mnu.add(wizardAction);                
        mnu.add(publishAction);
        mnu.add(openFromServerAction);
        mnu.add(viewReportSqlAction);
        mnu.addSeparator();

        JMenu mnu2 = new JMenu(I18NSupport.getString("menu_templates"));
        mnu2.add(new CreateTemplateAction());
        mnu2.add(new ModifyTemplateAction());
        mnu2.add(applyTemplateAction);
        mnu2.add(extractTemplateAction);
        mnu.add(mnu2);

        mnu.addSeparator();
        mnu.add(backupAction);
        mnu.add(restoreAction);
        mnu.add(importAction);
        mnu.add(settingsAction);
        mnu.addSeparator();
        mnu.add(new RestoreDockingAction());
        mnu.addSeparator();
        mnu.add(manageI18nAction);
        mnu.add(createLanguageMenu());
        return mnu;
    }

    private JMenu createLanguageMenu() {
        JMenu mnu = new JMenu(I18NSupport.getString("language"));
        mnu.setMnemonic(ShortcutsUtil.getMnemonic("menu.language.mnemonic", new Integer('L')));

        for (Language lang : LanguageAction.getLanguages()) {
        	mnu.add(new LanguageAction(lang.getLanguage()));     
        }
       
        return mnu;
    }
    
    public void enableBackAction(boolean enable) {
    	backAction.setEnabled(enable);
    }

}