/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2016 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.spoon.dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.pentaho.capabilities.api.ICapability;
import org.pentaho.capabilities.impl.DefaultCapabilityManager;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.KettleClientEnvironment;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.Props;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.KettleLogStore;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* Created by nbaker on 4/7/15.
*/
public class CapabilityManagerDialog {
private final Shell parent;
private final PropsUI props;
private Shell shell;
private List<Button> buttons = new ArrayList<Button>();
public CapabilityManagerDialog( Shell parent ) {
this.parent = parent;
props = PropsUI.getInstance();
}
public static void main( String[] args ) {
Display display = new Display( );
try {
KettleEnvironment.init();
PropsUI.init( display, Props.TYPE_PROPERTIES_SPOON );
KettleLogStore
.init( PropsUI.getInstance().getMaxNrLinesInLog(), PropsUI.getInstance().getMaxLogLineTimeoutMinutes() );
} catch ( KettleException e ) {
e.printStackTrace();
}
KettleClientEnvironment.getInstance().setClient( KettleClientEnvironment.ClientType.SPOON );
Shell shell = new Shell( display, SWT.DIALOG_TRIM );
shell.open();
CapabilityManagerDialog capabilityManagerDialog = new CapabilityManagerDialog( shell );
capabilityManagerDialog.open();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
}
public void open() {
final Display display = parent.getDisplay();
shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN );
props.setLook( shell );
shell.setImage( GUIResource.getInstance().getImageSpoon() );
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setLayout( formLayout );
shell.setText( BaseMessages.getString( getClass(), "CapabilityManager.Dialog.Title" ) );
int margin = Const.MARGIN;
Button closeButton = new Button( shell, SWT.PUSH );
closeButton.setText( BaseMessages.getString( getClass(), "System.Button.Close" ) );
BaseStepDialog.positionBottomButtons( shell, new Button[] { closeButton, }, margin, null );
// Add listeners
closeButton.addListener( SWT.Selection, new Listener() {
public void handleEvent( Event e ) {
shell.dispose();
}
} );
ScrolledComposite scrollpane = new ScrolledComposite( shell, SWT.BORDER | SWT.V_SCROLL );
FormData treeFormData = new FormData();
treeFormData.left = new FormAttachment( 0, 0 ); // To the right of the label
treeFormData.top = new FormAttachment( 0, 0 );
treeFormData.right = new FormAttachment( 100, 0 );
Label label = new Label( shell, SWT.NONE );
label.setText( "Capabilities:" );
label.setLayoutData( treeFormData );
treeFormData = new FormData();
treeFormData.left = new FormAttachment( 0, 0 ); // To the right of the label
treeFormData.top = new FormAttachment( label, 0 );
treeFormData.right = new FormAttachment( 100, 0 );
treeFormData.bottom = new FormAttachment( closeButton, -margin * 2 );
scrollpane.setLayoutData( treeFormData );
scrollpane.setExpandVertical( true );
scrollpane.setExpandHorizontal( true );
scrollpane.setAlwaysShowScrollBars( true );
Composite mainPanel = new Composite( scrollpane, SWT.NONE );
scrollpane.setContent( mainPanel );
scrollpane.setSize( 250, 400 );
mainPanel.setLayout( new GridLayout( 1, false ) );
Set<ICapability> allCapabilities = DefaultCapabilityManager.getInstance().getAllCapabilities();
SortedSet<ICapability> capabilitySortedSet = new TreeSet<ICapability>( allCapabilities );
for ( final ICapability capability : capabilitySortedSet ) {
final Button button = new Button( mainPanel, SWT.CHECK );
button.setLayoutData( new GridData( GridData.FILL_BOTH, SWT.BEGINNING, false, false ) );
button.setSelection( capability.isInstalled() );
button.setText( capability.getId() );
buttons.add( button );
button.addSelectionListener( new SelectionAdapter() {
@Override public void widgetSelected( SelectionEvent selectionEvent ) {
final boolean selected = ( (Button) selectionEvent.widget ).getSelection();
new Thread( new Runnable() {
@Override public void run() {
final Future<Boolean> future = ( selected ) ? capability.install() : capability.uninstall();
try {
final Boolean successful = future.get();
display.asyncExec( new Runnable() {
@Override public void run() {
button.setSelection( successful );
if ( !successful ) {
MessageDialog dialog = new MessageDialog( shell, "Capability Install Error", null,
"Error Installing Capability:\n\n" + capability.getId(), MessageDialog.ERROR,
new String[] { "OK" }, 0 );
dialog.open();
} else {
MessageDialog dialog = new MessageDialog( shell, "Capability Install Success", null,
capability.getId() + " " + ( ( !selected ) ? "un" : "" ) + "installed successfully", MessageDialog.INFORMATION,
new String[] { "OK" }, 0 );
dialog.open();
}
updateAllCheckboxes();
}
} );
} catch ( InterruptedException e ) {
e.printStackTrace();
} catch ( ExecutionException e ) {
e.printStackTrace();
}
}
} ).run();
}
} );
}
mainPanel.setSize( mainPanel.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
scrollpane.setMinSize( mainPanel.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
BaseStepDialog.setSize( shell, 250, 400, false );
shell.open();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
}
private void updateAllCheckboxes() {
DefaultCapabilityManager capabilityManager = DefaultCapabilityManager.getInstance();
for ( Button button : buttons ) {
button.setSelection( capabilityManager.getCapabilityById( button.getText() ).isInstalled() );
}
}
}