/*! * 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.ui.datasources.sequence; import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot; import org.pentaho.reporting.engine.classic.core.MasterReport; import org.pentaho.reporting.engine.classic.core.ReportDataFactoryException; import org.pentaho.reporting.engine.classic.core.designtime.DefaultDesignTimeContext; import org.pentaho.reporting.engine.classic.core.designtime.DesignTimeContext; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.DataSetQuery; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.NamedQueryModel; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.QueryAddAction; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.QueryNameListCellRenderer; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.QueryNameTextFieldDocumentListener; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.QueryRemoveAction; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.QuerySelectedHandler; import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.ExceptionDialog; import org.pentaho.reporting.engine.classic.core.modules.misc.datafactory.sequence.Sequence; import org.pentaho.reporting.engine.classic.core.modules.misc.datafactory.sequence.SequenceDataFactory; import org.pentaho.reporting.engine.classic.core.modules.misc.datafactory.sequence.SequenceDescription; import org.pentaho.reporting.engine.classic.core.modules.misc.datafactory.sequence.SequenceRegistry; import org.pentaho.reporting.libraries.designtime.swing.BorderlessButton; import org.pentaho.reporting.libraries.designtime.swing.CommonDialog; import org.pentaho.reporting.libraries.designtime.swing.background.DataPreviewDialog; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; public class SequenceDataSourceEditor extends CommonDialog { private class QueryNameHandler extends QueryNameTextFieldDocumentListener<Sequence> { private QueryNameHandler( final NamedQueryModel<Sequence> dialogModel ) { super( dialogModel ); } protected void setEditorQuery( final DataSetQuery<Sequence> dataSetQuery ) { if ( dataSetQuery == null ) { queryNameTextField.setText( null ); sequenceEditor.setSequence( null ); return; } queryNameTextField.setText( dataSetQuery.getQueryName() ); sequenceEditor.setSequence( dataSetQuery.getQuery() ); } } private class PreviewAction extends AbstractAction { private PreviewAction() { putValue( Action.NAME, Messages.getString( "SequenceDataSourceEditor.Preview.Name" ) ); } public void actionPerformed( final ActionEvent aEvt ) { try { final Sequence query = sequenceEditor.getSequence(); if ( query == null ) { return; } final DataPreviewDialog previewDialog = new DataPreviewDialog( SequenceDataSourceEditor.this ); final SequencePreviewWorker worker = new SequencePreviewWorker( query, designTimeContext ); previewDialog.showData( worker ); final ReportDataFactoryException factoryException = worker.getException(); if ( factoryException != null ) { ExceptionDialog.showExceptionDialog( SequenceDataSourceEditor.this, Messages.getString( "SequenceDataSourceEditor.PreviewError.Title" ), Messages.getString( "SequenceDataSourceEditor.PreviewError.Message" ), factoryException ); } } catch ( Exception e ) { ExceptionDialog.showExceptionDialog( SequenceDataSourceEditor.this, Messages.getString( "SequenceDataSourceEditor.PreviewError.Title" ), Messages.getString( "SequenceDataSourceEditor.PreviewError.Message" ), e ); } } } private class SequenceChangeHandler implements PropertyChangeListener { private SequenceChangeHandler() { } public void propertyChange( final PropertyChangeEvent evt ) { final DataSetQuery<Sequence> selectedQuery = queries.getQueries().getSelectedQuery(); if ( selectedQuery != null ) { selectedQuery.setQuery( sequenceEditor.getSequence() ); } } } private class SequenceQueryModel extends NamedQueryModel<Sequence> { private SequenceQueryModel() { } protected Sequence createDefaultObject() { final SequenceDescription defaultSequence = getDefaultSequence(); if ( defaultSequence == null ) { return null; } return defaultSequence.newInstance(); } protected void setQuerySelected( final boolean querySelected ) { super.setQuerySelected( querySelected ); queryNameTextField.setEnabled( querySelected ); sequenceEditor.setEnabled( querySelected ); } public void setSelectedDataSetQuery( final DataSetQuery<Sequence> sequenceDataSetQuery ) { sequenceEditor.stopEditing(); super.setSelectedDataSetQuery( sequenceDataSetQuery ); } } private JTextField queryNameTextField; private JList queryNameList; private SequenceEditor sequenceEditor; private NamedQueryModel<Sequence> queries; private DesignTimeContext designTimeContext; private SequenceRegistry registry; private PreviewAction previewAction; /** * @noinspection FieldCanBeLocal, UnusedDeclaration */ private QuerySelectedHandler querySelectedHandler; public SequenceDataSourceEditor() { init(); } public SequenceDataSourceEditor( final Frame owner ) throws HeadlessException { super( owner ); init(); } public SequenceDataSourceEditor( final Dialog owner ) throws HeadlessException { super( owner ); init(); } private SequenceDescription getDefaultSequence() { final SequenceDescription[] sequences = registry.getSequences(); if ( sequences.length == 0 ) { return null; } return sequences[ 0 ]; } protected void init() { registry = new SequenceRegistry(); queries = new SequenceQueryModel(); previewAction = new PreviewAction(); final QueryNameHandler queryNameHandler = new QueryNameHandler( queries ); queryNameList = new JList( queries.getQueries() ); queryNameList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); queryNameList.setVisibleRowCount( 5 ); queryNameList.setCellRenderer( new QueryNameListCellRenderer() ); querySelectedHandler = new QuerySelectedHandler<Sequence>( queries, queryNameList ); queryNameTextField = new JTextField( null, 0 ); queryNameTextField.setColumns( 35 ); queryNameTextField.getDocument().addDocumentListener( queryNameHandler ); queryNameTextField.setEnabled( false ); sequenceEditor = new SequenceEditor(); sequenceEditor.addPropertyChangeListener( "sequence", new SequenceChangeHandler() ); setTitle( Messages.getString( "SequenceDataSourceEditor.Title" ) ); super.init(); } protected String getDialogId() { return "SequenceDataSourceEditor"; } protected Component createContentPane() { final JPanel namePanel = new JPanel( new BorderLayout() ); namePanel.setBorder( BorderFactory.createEmptyBorder( 5, 5, 0, 0 ) ); namePanel.add( BorderLayout.NORTH, new JLabel( Messages.getString( "SequenceDataSourceEditor.QueryName" ) ) ); namePanel.add( BorderLayout.CENTER, queryNameTextField ); final JPanel queryConfigPane = new JPanel( new BorderLayout() ); queryConfigPane.add( createQuerySelectionPanel(), BorderLayout.NORTH ); queryConfigPane.add( namePanel, BorderLayout.CENTER ); final JPanel previewButtonPanel = new JPanel( new FlowLayout( FlowLayout.RIGHT ) ); previewButtonPanel.add( new JButton( previewAction ) ); final JPanel contentPane = new JPanel(); contentPane.setLayout( new BorderLayout() ); contentPane.add( queryConfigPane, BorderLayout.NORTH ); contentPane.add( sequenceEditor, BorderLayout.CENTER ); contentPane.add( previewButtonPanel, BorderLayout.SOUTH ); return contentPane; } private JPanel createQuerySelectionPanel() { final QueryRemoveAction removeQueryAction = new QueryRemoveAction( queries ); final JPanel queryListButtonsPanel = new JPanel( new FlowLayout( FlowLayout.RIGHT ) ); queryListButtonsPanel.add( new BorderlessButton( new QueryAddAction( queries ) ) ); queryListButtonsPanel.add( new BorderlessButton( removeQueryAction ) ); final JPanel queryListDetailsPanel = new JPanel( new BorderLayout() ); queryListDetailsPanel .add( new JLabel( Messages.getString( "SequenceDataSourceEditor.QueryDetailsLabel" ) ), BorderLayout.WEST ); queryListDetailsPanel.add( queryListButtonsPanel, BorderLayout.EAST ); // Create the query list panel final JPanel queryListPanel = new JPanel( new BorderLayout() ); queryListPanel.setBorder( BorderFactory.createEmptyBorder( 0, 5, 5, 5 ) ); queryListPanel.add( BorderLayout.NORTH, queryListDetailsPanel ); queryListPanel.add( BorderLayout.CENTER, new JScrollPane( queryNameList ) ); return queryListPanel; } public SequenceDataFactory performConfiguration( final DesignTimeContext context, final SequenceDataFactory dataFactory, final String selectedQuery ) { this.designTimeContext = context; if ( this.designTimeContext != null ) { sequenceEditor.applyLocaleSettings( context.getLocaleSettings() ); } if ( dataFactory != null ) { final String[] queryNames = dataFactory.getQueryNames(); for ( int i = 0; i < queryNames.length; i++ ) { final String queryName = queryNames[ i ]; final Sequence query = dataFactory.getSequence( queryName ); queries.addQuery( queryName, query ); } } queries.setSelectedQuery( selectedQuery ); if ( performEdit() == false ) { return null; } sequenceEditor.stopEditing(); final SequenceDataFactory retval = new SequenceDataFactory(); for ( final DataSetQuery<Sequence> query : this.queries.getQueries() ) { retval.addSequence( query.getQueryName(), query.getQuery() ); } return retval; } public static void main( String[] args ) { ClassicEngineBoot.getInstance().start(); SequenceDataSourceEditor ed = new SequenceDataSourceEditor(); ed.performConfiguration( new DefaultDesignTimeContext( new MasterReport() ), null, null ); } }