/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed 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 org.pentaho.di.ui.repository.dialog;
import java.util.Date;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.ProgressMonitorListener;
import org.pentaho.di.core.gui.HasOverwritePrompter;
import org.pentaho.di.core.gui.OverwritePrompter;
import org.pentaho.di.core.util.ExecutorUtil;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.imp.ImportRules;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.repository.IRepositoryImporter;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.repository.RepositoryImportFeedbackInterface;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.dialog.DisplayInvocationHandler;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.dialog.PopupOverwritePrompter;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.core.gui.WindowProperty;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
/**
* Takes care of displaying a dialog that will handle the wait while we are importing a backup file from XML...
*
* @author Matt
* @since 03-jun-2005
*/
public class RepositoryImportProgressDialog extends Dialog implements ProgressMonitorListener,
RepositoryImportFeedbackInterface, HasOverwritePrompter {
private static Class<?> PKG = RepositoryImportProgressDialog.class;
private Shell shell, parent;
private Display display;
private PropsUI props;
private Label wLabel;
private Text wLogging;
private Button wClose;
private boolean askOverwrite = true;
private String fileDirectory;
private String[] filenames;
private RepositoryDirectoryInterface baseDirectory;
private Repository rep;
private String versionComment;
private ImportRules importRules;
public RepositoryImportProgressDialog( Shell parent, int style, Repository rep, String fileDirectory,
String[] filenames, RepositoryDirectoryInterface baseDirectory, String versionComment ) {
this( parent, style, rep, fileDirectory, filenames, baseDirectory, versionComment, new ImportRules() );
}
public RepositoryImportProgressDialog( Shell parent, int style, Repository rep, String fileDirectory,
String[] filenames, RepositoryDirectoryInterface baseDirectory, String versionComment,
ImportRules importRules ) {
super( parent, style );
this.props = PropsUI.getInstance();
this.parent = parent;
this.rep = rep;
this.fileDirectory = fileDirectory;
this.filenames = filenames;
this.baseDirectory = baseDirectory;
this.versionComment = versionComment;
this.importRules = importRules;
}
public void open() {
display = parent.getDisplay();
shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN );
props.setLook( shell );
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setText( BaseMessages.getString( PKG, "RepositoryImportDialog.Title" ) );
shell.setImage( GUIResource.getInstance().getImageSpoon() );
shell.setLayout( formLayout );
//
// The task line...
// ////////////////////////////////////////////////////////////////
wLabel = new Label( shell, SWT.LEFT );
props.setLook( wLabel );
FormData fdLabel = new FormData();
fdLabel.left = new FormAttachment( 0, 0 );
fdLabel.top = new FormAttachment( 0, 0 );
fdLabel.right = new FormAttachment( 100, 0 );
wLabel.setLayoutData( fdLabel );
//
// The close button...
// ////////////////////////////////////////////////////////////////
// Buttons
wClose = new Button( shell, SWT.PUSH );
wClose.setText( BaseMessages.getString( PKG, "System.Button.Close" ) );
BaseStepDialog.positionBottomButtons( shell, new Button[] { wClose }, Const.MARGIN, (Control) null );
wClose.setEnabled( false );
wClose.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
dispose();
}
} );
//
// Then the logging...
// ////////////////////////////////////////////////////////////////
wLogging = new Text( shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL );
props.setLook( wLabel );
FormData fdLogging = new FormData();
fdLogging.left = new FormAttachment( 0, 0 );
fdLogging.top = new FormAttachment( wLabel, Const.MARGIN );
fdLogging.right = new FormAttachment( 100, 0 );
fdLogging.bottom = new FormAttachment( wClose, -Const.MARGIN );
wLogging.setLayoutData( fdLogging );
display.asyncExec( new Runnable() {
public void run() {
// Detect X or ALT-F4 or something that kills this window...
shell.addShellListener( new ShellAdapter() {
public void shellClosed( ShellEvent e ) {
dispose();
}
} );
}
} );
BaseStepDialog.setSize( shell, 1024, 768, true );
shell.open();
ExecutorUtil.getExecutor().submit( new Runnable() {
@Override
public void run() {
IRepositoryImporter importer = rep.getImporter();
importer.setImportRules( importRules );
importer.importAll( DisplayInvocationHandler.forObject( RepositoryImportFeedbackInterface.class,
RepositoryImportProgressDialog.this, display, rep.getLog(), true ), fileDirectory, filenames,
baseDirectory, false, false, versionComment );
if ( !shell.isDisposed() ) {
display.asyncExec( new Runnable() {
@Override
public void run() {
wClose.setEnabled( true );
}
} );
}
}
} );
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
}
public void dispose() {
props.setScreen( new WindowProperty( shell ) );
shell.dispose();
}
public void setLabel( String labelText ) {
wLabel.setText( labelText );
}
public void updateDisplay() {
shell.getDisplay().update();
}
public void showError( String title, String message, Exception e ) {
new ErrorDialog( shell, title, message, e );
}
public boolean transOverwritePrompt( TransMeta transMeta ) {
MessageDialogWithToggle md = new MessageDialogWithToggle( shell,
BaseMessages.getString( PKG, "RepositoryImportDialog.OverwriteTrans.Title" ),
null,
BaseMessages.getString( PKG, "RepositoryImportDialog.OverwriteTrans.Message", transMeta.getName() ),
MessageDialog.QUESTION, new String[] {
BaseMessages.getString( PKG, "System.Button.Yes" ),
BaseMessages.getString( PKG, "System.Button.No" ) },
1,
BaseMessages.getString( PKG, "RepositoryImportDialog.DontAskAgain.Label" ), !askOverwrite );
MessageDialogWithToggle.setDefaultImage( GUIResource.getInstance().getImageSpoon() );
int answer = md.open();
askOverwrite = !md.getToggleState();
return ( answer & 0xFF ) == 0;
}
public boolean jobOverwritePrompt( JobMeta jobMeta ) {
MessageDialogWithToggle md =
new MessageDialogWithToggle(
shell, BaseMessages.getString( PKG, "RepositoryImportDialog.OverwriteJob.Title" ), null, BaseMessages
.getString( PKG, "RepositoryImportDialog.OverwriteJob.Message", jobMeta.getName() ),
MessageDialog.QUESTION, new String[] {
BaseMessages.getString( PKG, "System.Button.Yes" ),
BaseMessages.getString( PKG, "System.Button.No" ) },
1,
BaseMessages.getString( PKG, "RepositoryImportDialog.DontAskAgain.Label" ),
!askOverwrite );
MessageDialogWithToggle.setDefaultImage( GUIResource.getInstance().getImageSpoon() );
int answer = md.open();
askOverwrite = !md.getToggleState();
return ( answer & 0xFF ) == 0;
}
public void addLog( String line ) {
StringBuilder rest = new StringBuilder( XMLHandler.date2string( new Date() ) );
rest.append( " : " );
rest.append( line ).append( Const.CR );
wLogging.append( rest.toString() );
wLogging.setSelection( wLogging.getText().length() ); // make it scroll
}
public boolean askContinueOnErrorQuestion( String title, String message ) {
MessageBox mb = new MessageBox( shell, SWT.ICON_QUESTION | SWT.YES | SWT.NO );
mb.setMessage( message );
mb.setText( title );
int answer = mb.open();
return answer != SWT.NO;
}
public void beginTask( String message, int nrWorks ) {
addLog( message );
}
public void done() {
}
public boolean isCanceled() {
return false;
}
public void setTaskName( String taskName ) {
addLog( taskName );
}
public void subTask( String message ) {
addLog( message );
}
public void worked( int nrWorks ) {
}
@Override
public boolean isAskingOverwriteConfirmation() {
return askOverwrite;
}
@Override
public OverwritePrompter getOverwritePrompter() {
return DisplayInvocationHandler.forObject( OverwritePrompter.class, new PopupOverwritePrompter( shell, props ),
display, rep.getLog(), true );
}
}