package org.pentaho.reporting.designer.extensions.connectioneditor;
import org.pentaho.database.model.IDatabaseConnection;
import org.pentaho.reporting.designer.core.util.exceptions.UncaughtExceptionsModel;
import org.pentaho.reporting.engine.classic.core.modules.misc.connections.EditDataSourceMgmtService;
import org.pentaho.reporting.libraries.base.util.StringUtils;
import org.pentaho.reporting.libraries.designtime.swing.BorderlessButton;
import org.pentaho.reporting.libraries.designtime.swing.LibSwingUtil;
import org.pentaho.ui.xul.XulException;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.net.URL;
import java.util.List;
public class ConnectionEditorPanel extends JPanel {
private static class DataSourceDefinitionListCellRenderer extends DefaultListCellRenderer {
public Component getListCellRendererComponent( final JList list,
final Object value,
final int index,
final boolean isSelected,
final boolean cellHasFocus ) {
final JLabel listCellRendererComponent = (JLabel) super.getListCellRendererComponent( list, value, index,
isSelected,
cellHasFocus );
if ( value != null ) {
final String jndiName = ( (IDatabaseConnection) value ).getName();
if ( !"".equals( jndiName ) ) {
listCellRendererComponent.setText( jndiName );
} else {
listCellRendererComponent.setText( " " );
}
}
return listCellRendererComponent;
}
}
private class EditDataSourceAction extends AbstractAction implements ListSelectionListener {
private JList dataSourceList;
private EditDataSourceAction( final JList dataSourceList ) {
this.dataSourceList = dataSourceList;
final URL location =
ConnectionEditorPanel.class.getResource( "/org/pentaho/reporting/ui/datasources/jdbc/resources/Edit.png" );
if ( location != null ) {
putValue( Action.SMALL_ICON, new ImageIcon( location ) );
} else {
putValue( Action.NAME, Messages.getInstance().getString( "ConnectionEditorPanel.Edit.Name" ) );
}
putValue( Action.SHORT_DESCRIPTION,
Messages.getInstance().getString( "ConnectionEditorPanel.Edit.Description" ) );
setEnabled( isConnectionSelected() );
}
public void valueChanged( final ListSelectionEvent e ) {
setEnabled( isConnectionSelected() );
}
public void actionPerformed( final ActionEvent e ) {
final IDatabaseConnection existingConnection = (IDatabaseConnection) dataSourceList.getSelectedValue();
try {
final Window parentWindow = LibSwingUtil.getWindowAncestor( ConnectionEditorPanel.this );
final XulDatabaseDialog connectionDialog = new XulDatabaseDialog( parentWindow );
final IDatabaseConnection connectionDefinition = connectionDialog.open( existingConnection );
// See if the edit completed...
if ( connectionDefinition != null ) {
dialogModel.updateDatasourceById( existingConnection.getId(), connectionDefinition );
dataSourceModel.updateElementAt( connectionDefinition, dataSourceList.getSelectedIndex() );
dataSourceList.setSelectedValue( connectionDefinition, true );
}
} catch ( XulException e1 ) {
UncaughtExceptionsModel.getInstance().addException( e1 );
}
}
}
private class RemoveDataSourceAction extends AbstractAction implements ListSelectionListener {
private JList dataSourceList;
/**
* Defines an <code>Action</code> object with a default description string and default icon.
*
* @param dataSourceList the list containing the datasources
*/
private RemoveDataSourceAction( final JList dataSourceList ) {
this.dataSourceList = dataSourceList;
setEnabled( isConnectionSelected() );
final URL resource =
ConnectionEditorPanel.class.getResource( "/org/pentaho/reporting/ui/datasources/jdbc/resources/Remove.png" );
if ( resource != null ) {
putValue( Action.SMALL_ICON, new ImageIcon( resource ) );
} else {
putValue( Action.NAME, Messages.getInstance().getString( "ConnectionEditorPanel.Remove.Name" ) );
}
putValue( Action.SHORT_DESCRIPTION,
Messages.getInstance().getString( "ConnectionEditorPanel.Remove.Description" ) );
}
public void valueChanged( final ListSelectionEvent e ) {
setEnabled( isConnectionSelected() );
}
public void actionPerformed( final ActionEvent e ) {
final IDatabaseConnection source = (IDatabaseConnection) dataSourceList.getSelectedValue();
if ( source != null ) {
dialogModel.deleteDatasourceById( source.getId() );
dataSourceModel.removeElement( source );
}
}
}
private class AddDataSourceAction extends AbstractAction {
private JList dataSourceList;
private AddDataSourceAction( final JList dataSourceList ) {
this.dataSourceList = dataSourceList;
final URL location = ConnectionEditorPanel.class.getResource(
"/org/pentaho/reporting/ui/datasources/jdbc/resources/Add.png" );
if ( location != null ) {
putValue( Action.SMALL_ICON, new ImageIcon( location ) );
} else {
putValue( Action.NAME, Messages.getInstance().getString( "ConnectionEditorPanel.Add.Name" ) );
}
putValue( Action.SHORT_DESCRIPTION, Messages.getInstance().getString( "ConnectionEditorPanel.Add.Description" ) );
}
public void actionPerformed( final ActionEvent e ) {
try {
final Window parentWindow = LibSwingUtil.getWindowAncestor( ConnectionEditorPanel.this );
final XulDatabaseDialog connectionDialog = new XulDatabaseDialog( parentWindow );
final IDatabaseConnection connectionDefinition = connectionDialog.open( null );
if ( connectionDefinition != null &&
!StringUtils.isEmpty( connectionDefinition.getName() ) ) {
// A new JNDI source was created
dialogModel.createDatasource( connectionDefinition );
dataSourceModel.addElement( connectionDefinition );
dataSourceList.setSelectedValue( connectionDefinition, true );
}
} catch ( XulException e1 ) {
UncaughtExceptionsModel.getInstance().addException( e1 );
}
}
}
private EditDataSourceMgmtService dialogModel;
private JList dataSourceList;
private EditorComboBoxModel dataSourceModel;
public ConnectionEditorPanel() {
this.dialogModel = new EditDataSourceMgmtService();
initPanel();
}
protected void initPanel() {
setLayout( new BorderLayout() );
setBorder( BorderFactory.createEmptyBorder( 2, 5, 5, 5 ) );
dataSourceModel = new EditorComboBoxModel();
final List<IDatabaseConnection> datasources = dialogModel.getDatasources();
for ( int i = 0; i < datasources.size(); i++ ) {
dataSourceModel.addElement( datasources.get( i ) );
}
dataSourceList = new JList( dataSourceModel );
dataSourceList.setCellRenderer( new DataSourceDefinitionListCellRenderer() );
dataSourceList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
dataSourceList.setVisibleRowCount( 10 );
final EditDataSourceAction editDataSourceAction = new EditDataSourceAction( dataSourceList );
dataSourceList.addListSelectionListener( editDataSourceAction );
final RemoveDataSourceAction removeDataSourceAction = new RemoveDataSourceAction( dataSourceList );
dataSourceList.addListSelectionListener( removeDataSourceAction );
final JPanel connectionButtonPanel = new JPanel();
connectionButtonPanel.setLayout( new FlowLayout( FlowLayout.RIGHT ) );
connectionButtonPanel.add( new BorderlessButton( editDataSourceAction ) );
connectionButtonPanel.add( new BorderlessButton( new AddDataSourceAction( dataSourceList ) ) );
connectionButtonPanel.add( new BorderlessButton( removeDataSourceAction ) );
final JPanel connectionButtonPanelWrapper = new JPanel( new BorderLayout() );
connectionButtonPanelWrapper
.add( new JLabel( Messages.getInstance().getString( "ConnectionEditorPanel.Connections" ) ),
BorderLayout.CENTER );
connectionButtonPanelWrapper.add( connectionButtonPanel, BorderLayout.EAST );
add( BorderLayout.NORTH, connectionButtonPanelWrapper );
add( BorderLayout.CENTER, new JScrollPane( dataSourceList ) );
}
protected boolean isConnectionSelected() {
return dataSourceList.getSelectedIndex() != -1;
}
public void commit() {
dialogModel.commit();
}
}