/*
* 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.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.border.BevelBorder;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXLabel;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.JXStatusBar;
import org.noos.xing.mydoggy.plaf.ui.MyDoggyKeySpace;
import ro.nextreports.designer.action.chart.OpenChartAction;
import ro.nextreports.designer.action.report.OpenReportAction;
import ro.nextreports.designer.action.report.layout.export.ExportAction;
import ro.nextreports.designer.chart.ChartUtil;
import ro.nextreports.designer.datasource.DataSource;
import ro.nextreports.designer.datasource.DefaultDataSourceManager;
import ro.nextreports.designer.persistence.FileReportPersistence;
import ro.nextreports.designer.querybuilder.DBBrowserNode;
import ro.nextreports.designer.querybuilder.DBBrowserTree;
import ro.nextreports.designer.querybuilder.DBObject;
import ro.nextreports.designer.querybuilder.QueryBuilderPanel;
import ro.nextreports.designer.querybuilder.tree.DBNodeExpander;
import ro.nextreports.designer.ui.MemoryStatus;
import ro.nextreports.designer.util.I18NSupport;
import ro.nextreports.designer.util.ImageUtil;
import com.jgoodies.looks.Options;
/**
* @author Decebal Suiu
*/
public class MainFrame extends JXFrame {
private JXPanel workspacePanel;
private QueryBuilderPanel qbPanel;
private JXStatusBar statusBar;
private String baseTitle;
public MainFrame(String title) {
super(title);
baseTitle = title;
setIconImage(ImageUtil.getImage("next-reports"));
initComponents();
}
private void initComponents() {
Globals.setMainFrame(this);
// better text visualization for disabled components
Options.setPopupDropShadowEnabled(true); // add drop shadow to popup menu
UIDefaults uiDefaults = UIManager.getDefaults();
uiDefaults.put("ComboBox.disabledForeground", Color.DARK_GRAY);
uiDefaults.put("TextField.inactiveForeground", Color.DARK_GRAY);
uiDefaults.put("TextArea.inactiveBackground", Color.WHITE);
uiDefaults.put("FormattedTextField.inactiveForeground",Color.DARK_GRAY);
uiDefaults.put("PasswordField.inactiveForeground",Color.DARK_GRAY);
uiDefaults.put("CheckBox.disabledText", Color.DARK_GRAY);
// internationalization
UIManager.put("OptionPane.yesButtonText", I18NSupport.getString("optionpanel.yes"));
UIManager.put("OptionPane.cancelButtonText", I18NSupport.getString("optionpanel.cancel"));
UIManager.put("OptionPane.noButtonText", I18NSupport.getString("optionpanel.no"));
UIManager.put("OptionPane.okButtonText", I18NSupport.getString("optionpanel.ok"));
UIManager.put("OptionPane.messageDialogTitle", I18NSupport.getString("optionpanel.message"));
UIManager.put("ColorChooser.okText", I18NSupport.getString("colorchooser.ok"));
UIManager.put("ColorChooser.cancelText", I18NSupport.getString("colorchooser.cancel"));
UIManager.put("ColorChooser.resetText", I18NSupport.getString("colorchooser.reset"));
UIManager.put("FileChooser.saveInLabelText", I18NSupport.getString("FileChooser.saveInLabelText"));
UIManager.put("FileChooser.fileNameLabelText", I18NSupport.getString("FileChooser.fileNameLabelText"));
UIManager.put("FileChooser.folderNameLabelText", I18NSupport.getString("FileChooser.folderNameLabelText"));
UIManager.put("FileChooser.filesOfTypeLabelText", I18NSupport.getString("FileChooser.filesOfTypeLabelText"));
UIManager.put("FileChooser.saveButtonText", I18NSupport.getString("FileChooser.saveButtonText"));
UIManager.put("FileChooser.cancelButtonText", I18NSupport.getString("FileChooser.cancelButtonText"));
UIManager.put("FileChooser.saveButtonToolTipText", I18NSupport.getString("FileChooser.saveButtonToolTipText"));
UIManager.put("FileChooser.cancelButtonToolTipText", I18NSupport.getString("FileChooser.cancelButtonToolTipText"));
UIManager.put("FileChooser.upFolderToolTipText", I18NSupport.getString("FileChooser.upFolderToolTipText"));
UIManager.put("FileChooser.homeFolderToolTipText", I18NSupport.getString("FileChooser.homeFolderToolTipText"));
UIManager.put("FileChooser.newFolderToolTipText", I18NSupport.getString("FileChooser.newFolderToolTipText"));
UIManager.put("FileChooser.listViewButtonToolTipText", I18NSupport.getString("FileChooser.listViewButtonToolTipText"));
UIManager.put("FileChooser.detailsViewButtonToolTipText", I18NSupport.getString("FileChooser.detailsViewButtonToolTipText"));
// docking
UIManager.put(MyDoggyKeySpace.DRAG_ENABLED, false);
// inside connections dir are kept the queries/reports for every data source
DefaultDataSourceManager.getInstance().load();
File connections = new File(FileReportPersistence.CONNECTIONS_DIR);
if (!connections.exists()) {
connections.mkdir();
}
// inside reports dir are kept the generated reports
File reports = new File(ExportAction.REPORTS_DIR);
if (!reports.exists()) {
reports.mkdir();
}
// create workspace panel
workspacePanel = new JXPanel(new CardLayout());
// create query builder panel before menu(!!! for docking)
qbPanel = new QueryBuilderPanel();
qbPanel.initWorkspace();
setLayout(new BorderLayout());
// add(new MainToolBar(), BorderLayout.NORTH);
setToolBar(new MainToolBar());
statusBar = new JXStatusBar();
//statusBar.add(new JXLabel(""), JXStatusBar.Constraint.ResizeBehavior.FILL);
statusBar.add(new JXLabel(""), new JXStatusBar.Constraint(JXStatusBar.Constraint.ResizeBehavior.FILL, new Insets(0,5,2,2)));
statusBar.add(new MemoryStatus());
statusBar.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
setStatusBar(statusBar);
WorkspaceManager workspaceManager = WorkspaceManager.getInstance();
workspacePanel.add((Component) workspaceManager.getQueryWorkspace().getToolWindowManager(), WorkspaceManager.QUERY_WORKSPACE);
workspacePanel.add((Component) workspaceManager.getReportWorkspace().getToolWindowManager(), WorkspaceManager.REPORT_WORKSPACE);
workspacePanel.add((Component) workspaceManager.getChartWorkspace().getToolWindowManager(), WorkspaceManager.CHART_WORKSPACE);
add(workspacePanel, BorderLayout.CENTER);
DataSource ds = DefaultDataSourceManager.getInstance().getConnectedDataSource();
if (ds != null) {
setStatusBarMessage("<html>" + I18NSupport.getString("datasource.active") +
" <b>" + ds.getName() + "</b></html>");
}
setJMenuBar(new MainMenuBar());
Globals.getMainMenuBar().actionUpdate(ds != null);
Globals.getMainToolBar().actionUpdate(ds != null);
String systemReport = Globals.getSystemReport();
String systemChart = Globals.getSystemChart();
String systemPath = Globals.getSystemPath();
if (systemReport != null) {
openSystemReport(systemReport, systemPath);
} else if (systemChart != null) {
openSystemChart(systemChart, systemPath);
}
}
public void openSystemReport(String reportName) {
openSystemReport(qbPanel.getTree(), reportName);
}
public void openSystemReport(String reportName, String relativePath) {
openSystemReport(qbPanel.getTree(), reportName, relativePath);
}
public void openSystemReport(DBBrowserTree tree, String reportName) {
openSystemReport(tree, reportName, null);
}
public void openSystemReport(DBBrowserTree tree, String reportName, String relativePath) {
if (DefaultDataSourceManager.getInstance().getConnectedDataSource() == null) {
return;
}
DBBrowserNode node = tree.searchNode(DBNodeExpander.REPORTS);
tree.startExpandingTree(node, true, null);
DBBrowserNode selectedNode = null;
if (relativePath == null) {
// report inside Reports node
selectedNode = tree.searchNode(reportName, DBObject.REPORTS);
} else {
// report inside some folder
String absolutePath = FileReportPersistence.getReportsAbsolutePath() + File.separator + relativePath+ File.separator + reportName + FormSaver.REPORT_FULL_EXTENSION;
selectedNode = tree.searchNode(reportName, absolutePath, DBObject.REPORTS);
}
if (selectedNode == null) {
return;
}
OpenReportAction openAction = new OpenReportAction();
openAction.setResetServerReport(false);
openAction.setReportName(selectedNode.getDBObject().getName());
openAction.setReportPath(selectedNode.getDBObject().getAbsolutePath());
openAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, ""));
}
public void openSystemChart(String chartName) {
openSystemChart(qbPanel.getTree(), chartName);
}
public void openSystemChart(String chartName, String relativePath) {
openSystemChart(qbPanel.getTree(), chartName, relativePath);
}
public void openSystemChart(DBBrowserTree tree, String chartName) {
openSystemChart(tree, chartName, null);
}
public void openSystemChart(DBBrowserTree tree, String chartName, String relativePath) {
if (DefaultDataSourceManager.getInstance().getConnectedDataSource() == null) {
return;
}
DBBrowserNode node = tree.searchNode(DBNodeExpander.CHARTS);
tree.startExpandingTree(node, true, null);
DBBrowserNode selectedNode = null;
if (relativePath == null) {
// chart inside Charts node
selectedNode = tree.searchNode(chartName, DBObject.CHARTS);
} else {
// chart inside some folder
String absolutePath = FileReportPersistence.getChartsAbsolutePath() + File.separator + relativePath + File.separator + chartName + ChartUtil.CHART_FULL_EXTENSION;
selectedNode = tree.searchNode(chartName, absolutePath, DBObject.CHARTS);
}
if (selectedNode == null) {
return;
}
OpenChartAction openAction = new OpenChartAction();
openAction.setResetServerChart(false);
openAction.setChartName(selectedNode.getDBObject().getName());
openAction.setChartPath(selectedNode.getDBObject().getAbsolutePath());
openAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED , ""));
}
public QueryBuilderPanel getQueryBuilderPanel() {
return qbPanel;
}
public void setStatusBarMessage(String message) {
if (statusBar != null) {
((JXLabel) statusBar.getComponent(0)).setText(message);
}
}
void changeWorkspace(String workspaceName) {
((CardLayout) workspacePanel.getLayout()).show(workspacePanel, workspaceName);
}
public void updateTitle(String update) {
if (update == null) {
setTitle(baseTitle);
} else {
setTitle(baseTitle + " - " + update);
}
}
}