/*!
* 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 gui;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.metadata.DefaultExpressionMetaData;
import org.pentaho.reporting.engine.classic.core.metadata.ExpressionMetaData;
import org.pentaho.reporting.engine.classic.core.metadata.ExpressionRegistry;
import org.pentaho.reporting.libraries.designtime.swing.LibSwingUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Arrays;
public class ExpressionMetaDataEditor extends JFrame {
private class ShowPropertiesAction extends AbstractAction {
/**
* Defines an <code>Action</code> object with a default description string and default icon.
*/
private ShowPropertiesAction() {
putValue( Action.NAME, "Show Properties" );
}
/**
* Invoked when an action occurs.
*/
public void actionPerformed( final ActionEvent e ) {
StringBuffer completeText = new StringBuffer();
final int[] selectedRows = expressionsTable.getSelectedRows();
for ( int i = 0; i < selectedRows.length; i++ ) {
final int selectedRow = selectedRows[ i ];
final int modelRow = expressionsTable.convertRowIndexToModel( selectedRow );
final EditableExpressionMetaData data = metaData[ modelRow ];
data.sort( expressionsTableModel.getLocale() );
final String text = data.printBundleText( expressionsTableModel.getLocale() );
System.out.println( "# Printing metadata for " + metaData[ modelRow ].getName() );
System.out.println( text );
completeText.append( "# Printing metadata for " + metaData[ modelRow ].getName() );
completeText.append( "\n" );
completeText.append( text );
}
dialog.showText( completeText.toString() );
}
}
private class ShowModifiedAction extends AbstractAction {
/**
* Defines an <code>Action</code> object with a default description string and default icon.
*/
private ShowModifiedAction() {
putValue( Action.NAME, "Show Modified" );
}
/**
* Invoked when an action occurs.
*/
public void actionPerformed( final ActionEvent e ) {
StringBuffer completeText = new StringBuffer();
for ( int modelRow = 0; modelRow < metaData.length; modelRow++ ) {
final EditableExpressionMetaData data = metaData[ modelRow ];
if ( data.isModified() == false ) {
continue;
}
data.sort( expressionsTableModel.getLocale() );
final String text = data.printBundleText( expressionsTableModel.getLocale() );
System.out.println( "# Printing metadata for " + data.getName() );
System.out.println( text );
completeText.append( "# Printing metadata for " + data.getName() );
completeText.append( "\n" );
completeText.append( text );
}
if ( completeText.length() == 0 ) {
return;
}
dialog.showText( completeText.toString() );
}
}
private class EditExpressionAction extends AbstractAction {
/**
* Defines an <code>Action</code> object with a default description string and default icon.
*/
private EditExpressionAction() {
putValue( Action.NAME, "Edit Expression" );
}
/**
* Invoked when an action occurs.
*/
public void actionPerformed( final ActionEvent e ) {
final int selectedRow = expressionsTable.getSelectedRow();
if ( selectedRow == -1 ) {
return;
}
final int mapped = expressionsTable.convertRowIndexToModel( selectedRow );
final EditableExpressionMetaData data = metaData[ mapped ];
expressionPropertyMetaDataEditor.performEdit( data.getName(), data.getProperties() );
}
}
private class SortAction extends AbstractAction {
/**
* Defines an <code>Action</code> object with a default description string and default icon.
*/
private SortAction() {
putValue( Action.NAME, "Sort" );
}
/**
* Invoked when an action occurs.
*/
public void actionPerformed( final ActionEvent e ) {
Arrays.sort( metaData, new GroupedMetaDataComparator( expressionsTableModel.getLocale() ) );
for ( int i = 0; i < metaData.length; i++ ) {
final EditableExpressionMetaData expressionMetaData = metaData[ i ];
expressionMetaData.sort( expressionsTableModel.getLocale() );
}
expressionsTableModel.populate( metaData );
}
}
private class ExitAction extends AbstractAction implements WindowListener {
/**
* Defines an <code>Action</code> object with a default description string and default icon.
*/
private ExitAction() {
putValue( Action.NAME, "Quit" );
}
/**
* Invoked the first time a window is made visible.
*/
public void windowOpened( final WindowEvent e ) {
}
/**
* Invoked when the user attempts to close the window from the window's system menu.
*/
public void windowClosing( final WindowEvent e ) {
actionPerformed( null );
}
/**
* Invoked when a window has been closed as the result of calling dispose on the window.
*/
public void windowClosed( final WindowEvent e ) {
}
public void windowIconified( final WindowEvent e ) {
}
/**
* Invoked when a window is changed from a minimized to a normal state.
*/
public void windowDeiconified( final WindowEvent e ) {
}
/**
* Invoked when the Window is set to be the active Window. Only a Frame or a Dialog can be the active Window. The
* native windowing system may denote the active Window or its children with special decorations, such as a
* highlighted title bar. The active Window is always either the focused Window, or the first Frame or Dialog that
* is an owner of the focused Window.
*/
public void windowActivated( final WindowEvent e ) {
}
/**
* Invoked when a Window is no longer the active Window. Only a Frame or a Dialog can be the active Window. The
* native windowing system may denote the active Window or its children with special decorations, such as a
* highlighted title bar. The active Window is always either the focused Window, or the first Frame or Dialog that
* is an owner of the focused Window.
*/
public void windowDeactivated( final WindowEvent e ) {
}
/**
* Invoked when an action occurs.
*/
public void actionPerformed( final ActionEvent e ) {
boolean modified = false;
for ( int i = 0; i < metaData.length; i++ ) {
EditableExpressionMetaData data = metaData[ i ];
if ( data.isModified() ) {
modified = true;
break;
}
}
if ( modified ) {
if ( JOptionPane.showConfirmDialog( ExpressionMetaDataEditor.this,
"Really Quit? You have modified something.", "Warning", JOptionPane.YES_NO_OPTION )
== JOptionPane.YES_OPTION ) {
System.exit( 0 );
}
} else {
System.exit( 0 );
}
}
}
private EditableExpressionMetaData[] metaData;
private JTable expressionsTable;
private EditableMetaDataTableModel expressionsTableModel;
private ShowTextDialog dialog;
private ExpressionPropertyMetaDataEditor expressionPropertyMetaDataEditor;
public ExpressionMetaDataEditor()
throws HeadlessException {
setTitle( "Expression Metadata Editor" );
setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
final ExitAction exitAction = new ExitAction();
addWindowListener( exitAction );
expressionsTableModel = new EditableMetaDataTableModel();
expressionsTable = new JTable( expressionsTableModel );
expressionsTable.setDefaultRenderer( String.class, new EditableMetaDataRenderer() );
final JPanel contentPane = new JPanel();
contentPane.setLayout( new BorderLayout() );
contentPane.add( new JScrollPane( expressionsTable ), BorderLayout.CENTER );
setContentPane( contentPane );
final JMenu actionsMenu = new JMenu( "Actions" );
final SortAction sortAction = new SortAction();
actionsMenu.add( sortAction );
actionsMenu.add( new EditExpressionAction() );
actionsMenu.add( new ShowPropertiesAction() );
actionsMenu.add( new ShowModifiedAction() );
actionsMenu.addSeparator();
actionsMenu.add( exitAction );
final JMenuBar menuBar = new JMenuBar();
menuBar.add( actionsMenu );
setJMenuBar( menuBar );
final JToolBar toolBar = new JToolBar();
toolBar.add( sortAction );
toolBar.add( new EditExpressionAction() );
toolBar.add( new ShowPropertiesAction() );
toolBar.add( new ShowModifiedAction() );
contentPane.add( toolBar, BorderLayout.NORTH );
final ExpressionMetaData[] allExpressionMetaDatas = ExpressionRegistry.getInstance().getAllExpressionMetaDatas();
metaData = new EditableExpressionMetaData[ allExpressionMetaDatas.length ];
for ( int i = 0; i < allExpressionMetaDatas.length; i++ ) {
ExpressionMetaData expressionMetaData = allExpressionMetaDatas[ i ];
metaData[ i ] = new EditableExpressionMetaData( (DefaultExpressionMetaData) expressionMetaData );
}
expressionsTableModel.populate( metaData );
sortAction.actionPerformed( null );
dialog = new ShowTextDialog( this );
expressionPropertyMetaDataEditor = new ExpressionPropertyMetaDataEditor( this );
}
public static void main( String[] args ) {
ClassicEngineBoot.getInstance().start();
ExpressionMetaDataEditor editor = new ExpressionMetaDataEditor();
editor.pack();
editor.setSize( 800, 600 );
LibSwingUtil.centerFrameOnScreen( editor );
editor.setVisible( true );
}
}