/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.core.util;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.ListSelectionModel;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rtextarea.RTextScrollPane;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.designtime.swing.CommonDialog;
import org.pentaho.reporting.libraries.designtime.swing.FixDefaultListCellRenderer;
import org.pentaho.reporting.libraries.designtime.swing.KeyedComboBoxModel;
public class QuerySelectorDialog extends CommonDialog
{
private class MouseHandler extends MouseAdapter
{
public void mouseClicked(final MouseEvent e)
{
if (e.getClickCount() > 1 && e.getButton() == MouseEvent.BUTTON1)
{
setConfirmed(true);
QuerySelectorDialog.this.dispose();
}
}
}
private class SyntaxHighlightAction implements ActionListener
{
private SyntaxHighlightAction()
{
}
public void actionPerformed(final ActionEvent e)
{
final Object o = syntaxModel.getSelectedKey();
if (o instanceof String)
{
textArea.setSyntaxEditingStyle((String) o);
}
}
}
private JList fieldList;
private RSyntaxTextArea textArea;
private KeyedComboBoxModel<String, String> syntaxModel;
private JTabbedPane tab;
/**
* Creates a non-modal dialog without a title with the specified <code>Dialog</code> as its owner.
* <p/>
* This constructor sets the component's locale property to the value returned by
* <code>JComponent.getDefaultLocale</code>.
*
* @param owner the non-null <code>Dialog</code> from which the dialog is displayed
* @throws java.awt.HeadlessException if GraphicsEnvironment.isHeadless() returns true.
* @see java.awt.GraphicsEnvironment#isHeadless
* @see javax.swing.JComponent#getDefaultLocale
*/
public QuerySelectorDialog(final Dialog owner)
throws HeadlessException
{
super(owner);
init();
}
public QuerySelectorDialog(final Frame owner)
throws HeadlessException
{
super(owner);
init();
}
public QuerySelectorDialog()
throws HeadlessException
{
init();
}
protected void init()
{
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
fieldList = new JList();
fieldList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fieldList.setVisibleRowCount(5);
fieldList.setCellRenderer(new FixDefaultListCellRenderer());
fieldList.addMouseListener(new MouseHandler());
syntaxModel = new KeyedComboBoxModel<String, String>();
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_NONE), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.None"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_JAVA), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.Java"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.JavaScript"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_GROOVY), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.Groovy"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_HTML), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.Html"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_CSS), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.CSS"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_SQL), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.SQL"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_XML), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.XML"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_PYTHON), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.Python"));
syntaxModel.add((SyntaxConstants.SYNTAX_STYLE_TCL), UtilMessages.getInstance().getString("RSyntaxAreaLanguages.TCL"));
textArea = new RSyntaxTextArea();
textArea.setBracketMatchingEnabled(true);
textArea.setSyntaxEditingStyle(RSyntaxTextArea.SYNTAX_STYLE_JAVA);
textArea.setColumns(60);
textArea.setRows(20);
final JPanel syntaxSelectionPane = new JPanel();
syntaxSelectionPane.setLayout(new FlowLayout());
final JComboBox syntaxBox = new JComboBox(syntaxModel);
syntaxBox.addActionListener(new SyntaxHighlightAction());
syntaxSelectionPane.add(syntaxBox);
final JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
contentPane.add(new RTextScrollPane(500, 300, textArea, true), BorderLayout.CENTER);
contentPane.add(syntaxBox, BorderLayout.NORTH);
tab = new JTabbedPane();
tab.addTab(UtilMessages.getInstance().getString("QuerySelectorDialog.DefinedQueries"), new JScrollPane(fieldList));
tab.addTab(UtilMessages.getInstance().getString("QuerySelectorDialog.CustomQuery"), contentPane);
setTitle(UtilMessages.getInstance().getString("QuerySelectorDialog.SelectQuery"));
super.init();
}
protected String getDialogId()
{
return "ReportDesigner.Core.QuerySelector";
}
protected Component createContentPane()
{
return tab;
}
public void setQueries(final String[] queries, final String reportQuery)
{
final DefaultListModel listModel = new DefaultListModel();
boolean found = false;
for (int i = 0; i < queries.length; i++)
{
final String query = queries[i];
if (ObjectUtilities.equal(query, reportQuery))
{
found = true;
}
listModel.addElement(query);
}
fieldList.setModel(listModel);
fieldList.setSelectedValue(reportQuery, true);
this.textArea.setText(reportQuery);
if (found == false)
{
tab.setSelectedIndex(1);
}
else
{
tab.setSelectedIndex(0);
}
}
public String performEdit(final String[] queries, final String selectedQuery)
{
setQueries(queries, selectedQuery);
if (performEdit() == false)
{
return selectedQuery;
}
if (tab.getSelectedIndex() == 1)
{
return textArea.getText();
}
else
{
return ((String) fieldList.getSelectedValue());
}
}
}