ro.nextreports.designer.action.chart.OpenChartAction.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.designer.action.chart.OpenChartAction.java

Source

/*
 * 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.action.chart;

import ro.nextreports.engine.ReleaseInfoAdapter;
import ro.nextreports.engine.Report;
import ro.nextreports.engine.util.NameType;
import ro.nextreports.engine.util.NextChartUtil;
import ro.nextreports.engine.chart.Chart;
import ro.nextreports.engine.i18n.I18nUtil;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ro.nextreports.designer.Globals;
import ro.nextreports.designer.ReportLayoutUtil;
import ro.nextreports.designer.action.query.OpenQueryPerspectiveAction;
import ro.nextreports.designer.chart.ChartUtil;
import ro.nextreports.designer.i18n.action.I18nManager;
import ro.nextreports.designer.querybuilder.BrowserDialog;
import ro.nextreports.designer.querybuilder.BrowserPanel;
import ro.nextreports.designer.querybuilder.DBObject;
import ro.nextreports.designer.querybuilder.QueryBuilderPanel;
import ro.nextreports.designer.ui.list.CheckListItem;
import ro.nextreports.designer.util.I18NSupport;
import ro.nextreports.designer.util.ImageUtil;
import ro.nextreports.designer.util.MessageUtil;
import ro.nextreports.designer.util.NextReportsUtil;
import ro.nextreports.designer.util.ShortcutsUtil;
import ro.nextreports.designer.util.Show;
import ro.nextreports.designer.util.TableUtil;
import ro.nextreports.designer.util.UIActivator;

/**
 * User: mihai.panaitescu
 * Date: 17-Dec-2009
 * Time: 13:59:57
 */
public class OpenChartAction extends AbstractAction {

    private String chartName;
    private String chartPath;
    private static BrowserDialog dialog;
    private Map<String, List<CheckListItem>> itemMap;

    private boolean error = false;
    private String errorMessage = "";
    private boolean resetServerChart = true;
    private boolean testInner = true;

    private static final Log LOG = LogFactory.getLog(OpenChartAction.class);

    public OpenChartAction() {
        this(true);
    }

    public OpenChartAction(boolean fullName) {
        if (fullName) {
            putValue(Action.NAME, I18NSupport.getString("open.chart"));
        } else {
            putValue(Action.NAME, I18NSupport.getString("open.chart.small"));
        }
        Icon icon = ImageUtil.getImageIcon("chart_open");
        putValue(Action.SMALL_ICON, icon);
        putValue(Action.MNEMONIC_KEY, ShortcutsUtil.getMnemonic("chart.open.mnemonic", new Integer('A')));
        putValue(Action.ACCELERATOR_KEY,
                KeyStroke.getKeyStroke(ShortcutsUtil.getShortcut("chart.open.accelerator", "control A")));
        putValue(Action.SHORT_DESCRIPTION, I18NSupport.getString("open.chart"));
        putValue(Action.LONG_DESCRIPTION, I18NSupport.getString("open.chart"));
    }

    public void setChartName(String chartName) {
        this.chartName = chartName;
    }

    public void setChartPath(String chartPath) {
        this.chartPath = chartPath;
    }

    public void setTestInner(boolean testInner) {
        this.testInner = testInner;
    }

    public void actionPerformed(ActionEvent e) {

        if (testInner) {
            if (NextReportsUtil.isInnerEdit()) {
                return;
            }
        }

        if (MessageUtil.showReconnect()) {
            return;
        }

        if (chartName == null) {
            BrowserPanel browser = new BrowserPanel(BrowserPanel.CHART_BROWSER);
            dialog = new BrowserDialog(browser);
            dialog.pack();
            dialog.setResizable(false);
            Show.centrateComponent(Globals.getMainFrame(), dialog);
            dialog.setVisible(true);

            // On double click in OpenChart dialog the dialog is closed and set to null
            // see comment #2
            if (dialog != null) {
                if (dialog.okPressed()) {
                    chartName = browser.getSelectedName();
                    chartPath = browser.getSelectedFilePath();
                } else {
                    return;
                }
            }
        }

        Globals.getReportUndoManager().discardAllEdits();

        if (chartName == null) {
            return;
        }

        // comment #2  : for double click in OpenChart dialog
        if ((dialog != null) && dialog.isVisible()) {
            dialog.dispose();
            dialog = null;
        }

        final QueryBuilderPanel builderPanel = Globals.getMainFrame().getQueryBuilderPanel();

        if (!NextReportsUtil.saveYesNoCancel(I18NSupport.getString("open.chart"))) {
            return;
        }

        if (chartPath != null) {
            byte status = NextChartUtil.isValidChartVersion(chartPath);
            if (NextChartUtil.CHART_INVALID_NEWER == status) {
                Show.error(I18NSupport.getString("chart.version.invalid.newer",
                        ReleaseInfoAdapter.getVersionNumber()));
                return;
            }
        }

        if (resetServerChart) {
            Globals.resetServerFile();
        }

        Globals.setReportLoaded(false);
        Globals.setChartLoaded(false);

        Thread executorThread = new Thread(new Runnable() {

            public void run() {
                UIActivator activator = new UIActivator(Globals.getMainFrame(),
                        I18NSupport.getString("load.chart"));
                activator.start();

                try {
                    Globals.getMainMenuBar().enableLayoutPerspective(true);
                    Globals.getMainToolBar().enableLayoutPerspective(true);

                    final Chart chart = ChartUtil.loadChart(chartPath);
                    if (chart == null) {
                        if (activator != null) {
                            activator.stop();
                            activator = null;
                        }
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                Show.error(I18NSupport.getString("could.not.load.chart"));
                            }
                        });
                        return;
                    }

                    I18nManager.getInstance().setKeys(chart.getI18nkeys());
                    I18nManager.getInstance().setLanguages(chart.getLanguages());
                    I18nManager.getInstance().setCurrentLanguage(I18nUtil.getDefaultLanguage(chart));

                    final Report report = chart.getReport();
                    try {
                        itemMap = TableUtil.getItemMap(report);
                    } catch (Exception ex) {
                        // designer cannot be created (tables not found)
                        if (activator != null) {
                            activator.stop();
                            activator = null;
                        }
                        int option = JOptionPane.showConfirmDialog(Globals.getMainFrame(),
                                "<html>" + I18NSupport.getString("designer.load.error") + "<br>"
                                        + I18NSupport.getString("designer.load.error.table") + "<br>"
                                        + I18NSupport.getString("designer.load.error.edit.mode") + "</html>",
                                "", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE);
                        if (option != JOptionPane.YES_OPTION) {
                            return;
                        } else {
                            report.setSql(report.getQuery().toString());
                        }
                    }

                    if (Globals.getConnection() != null) {
                        List<NameType> columns = new ArrayList<NameType>();
                        try {
                            columns = ReportLayoutUtil.getAllColumnsForReport(chart.getReport());
                        } catch (Exception ex) {
                            LOG.error(ex.getMessage(), ex);
                            error = true;
                            errorMessage = I18NSupport.getString("could.not.load.chart.error.columns") + "\r\n"
                                    + ex.getMessage();
                        }
                        Globals.getChartDesignerPanel().getPropertiesPanel().setColumns(columns);
                        Globals.getChartLayoutPanel().setColumns(columns);
                    }

                    if (activator != null) {
                        activator.stop();
                        activator = null;
                    }

                    SwingUtilities.invokeAndWait(new Runnable() {
                        public void run() {

                            builderPanel.clear(true);

                            if (report.getSql() != null) {
                                builderPanel.selectSQLViewTab();
                                builderPanel.setUserSql(report.getSql());
                                Globals.setInitialQuery(report.getSql());
                            } else if (report.getQuery() != null) {
                                builderPanel.drawDesigner(report, itemMap);
                                itemMap.clear();
                                Globals.setInitialQuery(report.getQuery().toString());
                            }
                            builderPanel.setParameters(report.getParameters());
                            builderPanel.selectTreeNode(chartName, DBObject.CHARTS);

                            Globals.setCurrentQueryName(null);
                            Globals.setCurrentQueryAbsolutePath(null);
                            Globals.setCurrentChartName(chartName);
                            Globals.setCurrentChartAbsolutePath(chartPath);

                            builderPanel.loadChart(chart);
                            Globals.getMainMenuBar().newChartActionUpdate();
                            Globals.getMainToolBar().newChartActionUpdate();

                            Globals.setOriginalSql(Globals.getMainFrame().getQueryBuilderPanel().getUserSql());
                            Globals.setChartLoaded(true);

                            if (error) {
                                new OpenQueryPerspectiveAction().actionPerformed(null);
                                Show.error(errorMessage);
                            }

                        }
                    });
                } catch (Exception ex) {
                    LOG.error(ex.getMessage(), ex);
                    Show.error(ex);
                } finally {
                    chartName = null;
                    if (activator != null) {
                        activator.stop();
                    }
                }

            }
        }, "NEXT : " + getClass().getSimpleName());
        executorThread.start();
    }

    public void setResetServerChart(boolean resetServerChart) {
        this.resetServerChart = resetServerChart;
    }

}