/*! ****************************************************************************** * * 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.job.entries.special; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.FillLayout; 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.Composite; import org.eclipse.swt.widgets.Control; 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.eclipse.swt.widgets.Spinner; import org.pentaho.di.core.Const; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.job.JobMeta; import org.pentaho.di.job.entries.special.JobEntrySpecial; import org.pentaho.di.job.entry.JobEntryDialogInterface; import org.pentaho.di.job.entry.JobEntryInterface; import org.pentaho.di.repository.Repository; import org.pentaho.di.ui.core.gui.GUIResource; import org.pentaho.di.ui.core.gui.WindowProperty; import org.pentaho.di.ui.job.dialog.JobDialog; import org.pentaho.di.ui.job.entry.JobEntryDialog; import org.pentaho.di.ui.trans.step.BaseStepDialog; public class JobEntrySpecialDialog extends JobEntryDialog implements JobEntryDialogInterface { private static Class<?> PKG = JobEntrySpecial.class; // for i18n purposes, needed by Translator2!! private static final String NOSCHEDULING = BaseMessages.getString( PKG, "JobSpecial.Type.NoScheduling" ); private static final String INTERVAL = BaseMessages.getString( PKG, "JobSpecial.Type.Interval" ); private static final String DAILY = BaseMessages.getString( PKG, "JobSpecial.Type.Daily" ); private static final String WEEKLY = BaseMessages.getString( PKG, "JobSpecial.Type.Weekly" ); private static final String MONTHLY = BaseMessages.getString( PKG, "JobSpecial.Type.Monthly" ); private Button wOK, wCancel; private Listener lsOK, lsCancel; private Shell shell; private SelectionAdapter lsDef; private JobEntrySpecial jobEntry; private boolean backupChanged; private Display display; private Button wRepeat; private Spinner wIntervalSeconds, wIntervalMinutes; private CCombo wType; private Spinner wHour; private Spinner wMinutes; private CCombo wDayOfWeek; private Spinner wDayOfMonth; public JobEntrySpecialDialog( Shell parent, JobEntryInterface jobEntryInt, Repository rep, JobMeta jobMeta ) { super( parent, jobEntryInt, rep, jobMeta ); jobEntry = (JobEntrySpecial) jobEntryInt; } public JobEntryInterface open() { Shell parent = getParent(); display = parent.getDisplay(); shell = new Shell( parent, props.getJobsDialogStyle() ); props.setLook( shell ); JobDialog.setShellImage( shell, jobEntry ); shell.setImage( GUIResource.getInstance().getImageStart() ); ModifyListener lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { jobEntry.setChanged(); } }; backupChanged = jobEntry.hasChanged(); FormLayout formLayout = new FormLayout(); formLayout.marginWidth = Const.FORM_MARGIN; formLayout.marginHeight = Const.FORM_MARGIN; shell.setLayout( formLayout ); shell.setText( BaseMessages.getString( PKG, "JobSpecial.Scheduling.Label" ) ); int margin = Const.MARGIN; wRepeat = new Button( shell, SWT.CHECK ); wRepeat.addListener( SWT.Selection, new Listener() { public void handleEvent( Event arg0 ) { enableDisableControls(); } } ); placeControl( shell, BaseMessages.getString( PKG, "JobSpecial.Repeat.Label" ), wRepeat, null ); wType = new CCombo( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wType.addModifyListener( lsMod ); wType.addListener( SWT.Selection, new Listener() { public void handleEvent( Event arg0 ) { enableDisableControls(); } } ); wType.add( NOSCHEDULING ); wType.add( INTERVAL ); wType.add( DAILY ); wType.add( WEEKLY ); wType.add( MONTHLY ); wType.setEditable( false ); wType.setVisibleItemCount( wType.getItemCount() ); placeControl( shell, BaseMessages.getString( PKG, "JobSpecial.Type.Label" ), wType, wRepeat ); wIntervalSeconds = new Spinner( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wIntervalSeconds.setMinimum( 0 ); wIntervalSeconds.setMaximum( Integer.MAX_VALUE ); placeControl( shell, BaseMessages.getString( PKG, "JobSpecial.IntervalSeconds.Label" ), wIntervalSeconds, wType ); wIntervalMinutes = new Spinner( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wIntervalMinutes.setMinimum( 0 ); wIntervalMinutes.setMaximum( Integer.MAX_VALUE ); placeControl( shell, BaseMessages.getString( PKG, "JobSpecial.IntervalMinutes.Label" ), wIntervalMinutes, wIntervalSeconds ); Composite time = new Composite( shell, SWT.NONE ); time.setLayout( new FillLayout() ); wHour = new Spinner( time, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wHour.setMinimum( 0 ); wHour.setMaximum( 23 ); wMinutes = new Spinner( time, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wMinutes.setMinimum( 0 ); wMinutes.setMaximum( 59 ); placeControl( shell, BaseMessages.getString( PKG, "JobSpecial.TimeOfDay.Label" ), time, wIntervalMinutes ); wDayOfWeek = new CCombo( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wDayOfWeek.addModifyListener( lsMod ); wDayOfWeek.add( BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Sunday" ) ); wDayOfWeek.add( BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Monday" ) ); wDayOfWeek.add( BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Tuesday" ) ); wDayOfWeek.add( BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Wednesday" ) ); wDayOfWeek.add( BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Thursday" ) ); wDayOfWeek.add( BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Friday" ) ); wDayOfWeek.add( BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Saturday" ) ); wDayOfWeek.setEditable( false ); wDayOfWeek.setVisibleItemCount( wDayOfWeek.getItemCount() ); placeControl( shell, BaseMessages.getString( PKG, "JobSpecial.DayOfWeek.Label" ), wDayOfWeek, time ); wDayOfMonth = new Spinner( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wDayOfMonth.addModifyListener( lsMod ); wDayOfMonth.setMinimum( 1 ); wDayOfMonth.setMaximum( 30 ); placeControl( shell, BaseMessages.getString( PKG, "JobSpecial.DayOfMonth.Label" ), wDayOfMonth, wDayOfWeek ); // Some buttons wOK = new Button( shell, SWT.PUSH ); wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) ); wCancel = new Button( shell, SWT.PUSH ); wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) ); BaseStepDialog.positionBottomButtons( shell, new Button[] { wOK, wCancel }, margin, wDayOfMonth ); // Add listeners lsCancel = new Listener() { public void handleEvent( Event e ) { cancel(); } }; lsOK = new Listener() { public void handleEvent( Event e ) { ok(); } }; wOK.addListener( SWT.Selection, lsOK ); wCancel.addListener( SWT.Selection, lsCancel ); lsDef = new SelectionAdapter() { public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wType.addSelectionListener( lsDef ); // Detect [X] or ALT-F4 or something that kills this window... shell.addShellListener( new ShellAdapter() { public void shellClosed( ShellEvent e ) { cancel(); } } ); getData(); enableDisableControls(); BaseStepDialog.setSize( shell, 350, 200, true ); shell.open(); props.setDialogSize( shell, "JobSpecialDialogSize" ); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return jobEntry; } public void dispose() { WindowProperty winprop = new WindowProperty( shell ); props.setScreen( winprop ); shell.dispose(); } public void getData() { wRepeat.setSelection( jobEntry.isRepeat() ); wType.select( jobEntry.getSchedulerType() ); wIntervalSeconds.setSelection( jobEntry.getIntervalSeconds() ); wIntervalMinutes.setSelection( jobEntry.getIntervalMinutes() ); wHour.setSelection( jobEntry.getHour() ); wMinutes.setSelection( jobEntry.getMinutes() ); wDayOfWeek.select( jobEntry.getWeekDay() ); wDayOfMonth.setSelection( jobEntry.getDayOfMonth() ); wType.addSelectionListener( lsDef ); } private void cancel() { jobEntry.setChanged( backupChanged ); jobEntry = null; dispose(); } private void ok() { jobEntry.setRepeat( wRepeat.getSelection() ); jobEntry.setSchedulerType( wType.getSelectionIndex() ); jobEntry.setIntervalSeconds( wIntervalSeconds.getSelection() ); jobEntry.setIntervalMinutes( wIntervalMinutes.getSelection() ); jobEntry.setHour( wHour.getSelection() ); jobEntry.setMinutes( wMinutes.getSelection() ); jobEntry.setWeekDay( wDayOfWeek.getSelectionIndex() ); jobEntry.setDayOfMonth( wDayOfMonth.getSelection() ); dispose(); } private void placeControl( Shell pShell, String text, Control control, Control under ) { int middle = props.getMiddlePct(); int margin = Const.MARGIN; Label label = new Label( pShell, SWT.RIGHT ); label.setText( text ); props.setLook( label ); FormData formDataLabel = new FormData(); formDataLabel.left = new FormAttachment( 0, 0 ); if ( under != null ) { formDataLabel.top = new FormAttachment( under, margin ); } else { formDataLabel.top = new FormAttachment( 0, 0 ); } formDataLabel.right = new FormAttachment( middle, 0 ); label.setLayoutData( formDataLabel ); props.setLook( control ); FormData formDataControl = new FormData(); formDataControl.left = new FormAttachment( middle, 0 ); if ( under != null ) { formDataControl.top = new FormAttachment( under, margin ); } else { formDataControl.top = new FormAttachment( 0, 0 ); } formDataControl.right = new FormAttachment( 100, 0 ); control.setLayoutData( formDataControl ); } private void enableDisableControls() { // if(wRepeat.getSelection()) { wType.setEnabled( true ); if ( NOSCHEDULING.equals( wType.getText() ) ) { wIntervalSeconds.setEnabled( false ); wIntervalMinutes.setEnabled( false ); wDayOfWeek.setEnabled( false ); wDayOfMonth.setEnabled( false ); wHour.setEnabled( false ); wMinutes.setEnabled( false ); } else if ( INTERVAL.equals( wType.getText() ) ) { wIntervalSeconds.setEnabled( true ); wIntervalMinutes.setEnabled( true ); wDayOfWeek.setEnabled( false ); wDayOfMonth.setEnabled( false ); wHour.setEnabled( false ); wMinutes.setEnabled( false ); } else if ( DAILY.equals( wType.getText() ) ) { wIntervalSeconds.setEnabled( false ); wIntervalMinutes.setEnabled( false ); wDayOfWeek.setEnabled( false ); wDayOfMonth.setEnabled( false ); wHour.setEnabled( true ); wMinutes.setEnabled( true ); } else if ( WEEKLY.equals( wType.getText() ) ) { wIntervalSeconds.setEnabled( false ); wIntervalMinutes.setEnabled( false ); wDayOfWeek.setEnabled( true ); wDayOfMonth.setEnabled( false ); wHour.setEnabled( true ); wMinutes.setEnabled( true ); } else if ( MONTHLY.equals( wType.getText() ) ) { wIntervalSeconds.setEnabled( false ); wIntervalMinutes.setEnabled( false ); wDayOfWeek.setEnabled( false ); wDayOfMonth.setEnabled( true ); wHour.setEnabled( true ); wMinutes.setEnabled( true ); } // } else { // wType.setEnabled(false); // wInterval.setEnabled(false); // wDayOfWeek.setEnabled(false); // wDayOfMonth.setEnabled(false); // wHour.setEnabled(false); // wMinutes.setEnabled(false); } }