/*! ****************************************************************************** * * 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() ); } } }